写点什么

神奇的 Duff's device

发布于: 4 小时前

C 语言编程领域,达夫设备(Duff's device)是一种将循环展开执行,从而提高执行效率的一种技术方法。


汤姆·达夫于 1983 年 11 月发明了这种方法,可能是迄今为止利用 C 语言 switch 语句特性所作的最巧妙的实现。


通过一个简单的例子,来理解一下什么是 Duff's device.


比如,一个循环复制的函数实现(只是例子,不考虑 memcpy):

void send( int * to, int * from, int count) {
for (int i = 0; i < count; i++) {
*to++ = *from++;
}
}
复制代码


如果 count 是 10000,那么就需要循环 10000 次。这么多次数的循环,对 CPU 利用率并不高。


用 Duff's device 方法改写后的代码,展示如下:

void send( int * to, int * from, int count) {    int 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);    }  }
复制代码


上面的代码中,使用了 C 语言的一个隐晦的能力,switch case + do while 组合,这个就是达夫设备(Duff's device)。


如果 count 为 10000,那么之前的代码需要循环 10000 次,而用 Duff' device 改写后,只需要 1250 次循环即可。


实现机理解析:

C 语言对 switch 语句的规范是比较松的,在 switch 控制语句内,条件标号(case)可以出现在任意子语句之前,充作其前缀。

此外若未加入 break 语句,则 switch 语句根据条件判定,跳转到对应的标号,并在开始执行后,控制流会一直执行到 switch 嵌套语句的末尾。

另一方面,C 语言本身也对跳转到循环内部提供了支持,因而此处的 switch/case 语句便可跳转到循环内部。


C 语言的这个能力,是不是非常神奇?


我的微信号是 实力程序员,欢迎大家转发至朋友圈,分享给更多的朋友。

发布于: 4 小时前阅读数: 4
用户头像

实力程序员,用实力证明自己 2014.12.31 加入

70后码农一枚,超过20年一线开发和管理经验,酷爱编程,探求技术原本

评论

发布
暂无评论
神奇的Duff's device