达夫设备(Duff's Device)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了达夫设备(Duff's Device)相关的知识,希望对你有一定的参考价值。

 达夫设备设备是一段非常巧妙,看起来非常诡异的c代码,它可以很大的提高程序执行的效率(本文将试验),达夫设备的来源我就不说了,我们来分析一下。

 

  达夫设备是考虑到我们一般用for或者while循环的时候,如果执行循环内容本身用不了多少时间,那么时间将被主要消耗在每次循环的比较语句上边。

  事实上比较语句是有很大优化空间的,假设你要循环1000次,结果你从第一次开始就不断的比较是否达到上界,这是很徒劳的。

 

  达夫这个哥们利用了switch语句的跌落行为设计了达夫设备。

 

  我们用达夫设备计算一个累加运算,累加很多次,并且与传统while循环进行时间比较。

 

测试主函数

  技术分享

 

 

达夫设备:

技术分享

  执行时间:

技术分享

它的执行时间是0.496s。  这里需要注意,x的定义是要用register关键字,这样cpu就会把x尽可能存入cpu内部的寄存器,但是不是百分之百会存进寄存器,因为计算机通用寄存器就那么一二十个(现在64新的cpu我也不知道有多少个,但是肯定很少),所以cpu也只是尽可能的给你把x放进寄存器而已。

 

现在我们看一下传统的循环的执行时间:

测试函数:

技术分享

传统方法:

技术分享

结果:

技术分享

 结果达夫设备设备确实缩短了不少时间。。

 

 

当然了,达夫设备还可以用for语句

技术分享

以上是关于达夫设备(Duff's Device)的主要内容,如果未能解决你的问题,请参考以下文章

CF587F Duff is Mad

将 duff 的设备从 C 移植到 JavaScript

Duff的设备在Swift中

c_cpp Duff的设备 - 在C中快速复制块

循环展开或 duff 可以帮助这种情况吗?

CF587F Duff is Mad(AC自动机+树状数组+分块)