Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4012549
  • 博文数量: 536
  • 博客积分: 10470
  • 博客等级: 上将
  • 技术积分: 4825
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-26 14:08
文章分类

全部博文(536)

文章存档

2024年(3)

2021年(1)

2019年(1)

2017年(1)

2016年(2)

2013年(2)

2012年(10)

2011年(43)

2010年(10)

2009年(17)

2008年(121)

2007年(252)

2006年(73)

分类:

2007-08-20 13:23:32

真的太神奇了. 我写C这么长时间也没发现. 真的很不错, 你一定没有这样使用过C吧, 你静下心来好好想想它真而很不错, 少了很多判断的.

我是在http://blogs.sun.com/weixue/category/C%2FC%2B%2B看到的, 真的很感谢博主让我认识了Duff's Device.

看一个简单的实例:

send(to, from, count)
    register short *to, *from;
    register count;
    {
        do
            *to = *from++;
        while(--count>0);
    }


很简单的数组复制问题, 应该大部分都知道这么写, 我也一样. 看看Duff's Device是怎么写的:

send(to, from, count)
    register short *to, *from;
    register count;
    {
        register n = (count + 7) / 8;
        switch (count % 8) {
        case 0: do{  *to = *from++;
        case 7:     *to = *from++;
        case 6:     *to = *from++;
        case 5:     *to = *from++;
        case 4:     *to = *from++;
        case 3:     *to = *from++;
        case 2:     *to = *from++;
        case 1:     *to = *from++;
                 } while (--n>0);
        }
    }


你想的到吗? 我一定是怎么也想不到了, 你静下心来好好想想他们有什么不同, 如果count很大时他们的效力将会差很多的, 少了很多判断吗.
-------------------

达夫设备是一个加速循环语句的C编码技巧。其基本思想是--减少循环测试的执行次数。

如 果在一个for 循环中,其中操作执行得如果足够快(比如说,一个赋值)——那么测试循环条件占用了循环所用时间的很大部分。循环应该被部分解开,这样数个操作一次完成, 测试操作也做的较少。其实,是通过switch语句将要进行的连续循环操作的次数进行了预判(根据擦case语句的位置)然后依次执行,而不必每次都去进 行测试条件。
在这里Duff's Device是个新颖的,有创造力的解决方案。

Duff's Device对效率的负面影响可能来自于代码膨胀(一些处理器更善于处理紧凑的循环而不是大的循环)和特别的结构。优化器被做成当遇一些更加技巧性的结构时可能会不知所措从而生成比较保守的代码。


参考文章:
http://www.lysator.liu.se/c/duffs-device.html
http://blogs.sun.com/weixue/category/C%2FC%2B%2B
阅读(3608) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~