美文网首页这事情急不得
达夫设备(Duff's device)

达夫设备(Duff's device)

作者: 这事情急不得 | 来源:发表于2019-04-14 00:11 被阅读29次

若干年前在校园招聘的时候,做到了这样一道笔试题, 当时一头雾水,并没有做出来:

问题: 下面这段代码的作用是什么?

(这里假设 to 和 from 都是数组指针,count 是 to 和 from 数组的大小, count > 0)

没错,你没看错,这段代码能神奇的通过编译。case 0 后面嵌入的那段do while 实在是碉堡了。

这里的关键是 switch 判断如果 match 之后,跳转到 case 分支的其实是无条件跳转 jump,也就是 goto,所以如果 match 到 case 7 ~ case 1, 都会直接进入 do while 内部执行。

do while 中的内容第一次从哪儿开始由 switch 决定,然后接下来就都是在 do while内部循环,因此接下来 switch 就再也不会执行了。

这里 (count + 7)/ 8 实际就是 (count / 8 + 1),count % 8 计算余数,可见这段代码实际就是执行把 count 个数值从 from 拷贝到 to 的操作。

发明上面这段代码的人叫做Duff,这段代码就叫做Duff's device(达夫设备)。

把 do while 从 switch case 中移出来后的等效代码如下,这样就好理解了:

那么为什么要大费周章的这么搞呢?直接写成这样不行吗:

其原因就是在于效率,在普通的写法中 --count > 0 这个条件的比较一共被执行了 count 次,而在Duff's Device 中, --n > 0 这个比较仅仅执行了 count / 8 次,也就是说Duff Device可以少执行整整8倍的条件比较语句。

来自网上的Duff's Device的可能的负面因素:

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

总之,这可能是一个优化性能的奇妙的技巧,但是为了代码的可读性和正确性请永远不要在实际产品中写这种代码,毕竟对现代计算机来说性能一般都并不是需要考虑的问题。

相关文章

网友评论

    本文标题:达夫设备(Duff's device)

    本文链接:https://www.haomeiwen.com/subject/rbyiiqtx.html