关于达夫设备(Duff's device)的理解

今天看到了一个Duff's device另类的算法设计,代码如下:

void send( int * to, int * from, int count){

register n = (count + 7) / 8/* count > 0assumed */

        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);
        }
}

刚开始看了半天也没搞清楚这段代码是怎么执行的,就上网查了查也没搞很明白,于是就写了一小代码测试了下,总算是弄明白了。这段程序的主体是do while而非switch case,理解这一点剩下就比较很好理解了。首先程序顺序执行进入switch case条件判断,根据count % 8的值直接跳转到相应case语句后执行,此时程序跳转到dowhile循环体内,接下来的程序就一直在do while循环体内运行,直到条件不满足。也就是说switch case在执行一次后就失去了作用(这时候由于已经没有了switch,所以后面的标号就变成普通标号了,程序就会忽略掉这些标号)

 

上面的代码也可用for语句实现,代码如下:

void my_send( int   * to,  int   * from,  int  count)
{     

 for  ( int  i  =   0 ; i  !=  count;  ++ i)  

{         

 * to ++   =   * from ++ ;    


}

 

这段代码的确很简单,也能正确执行,但是却忽略了一个重要因素:执行效率。计算一下就可以知道,使用for语句函数里面的循环条件,即icount的比较运算的次数,是Duff's device8倍!在做整数赋值的工作时,赋值运算的耗时是非常小的相比之下比较运算工作耗时较大是会大大地影响函数整体的效率的。Duff's device则是一种非常巧妙的解决办法,而且如果把8换成更大的数的话,效率提高会更多!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落叶惊风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值