完整代码在此处:http://pastebin.com/MM3vWmqA
在函数fast_generator中,我为两个语句添加了注释。如果切换这些语句,代码运行速度会快1.8倍。如果删除第一个语句,代码执行速度将比原始版本快,但与切换时相比速度较慢。
测试用例应如下。
首先 - 最慢。 452ms。
counter++;
i--;
第二 - 比第一个更快。 280ms。
i--;
counter++;
第三 - 比第一个快,但比第二个慢。 421ms。
i--;
原始语句的汇编输出是。
inc edx
mov eax, 6
我已经验证,当切换这些语句时,汇编程序输出保持不变,这些asm指令的唯一区别在于互换。
我用VC ++ 10和VC ++ 11测试过它,行为相同。有人可以解释为什么切换这些语句会加速算法~1.8倍?如果您认为std :: clock()不准确,请更改size = 7.在我的机器上,size = 7的差异是12000ms vs 7000ms。
答案 0 :(得分:3)
你的慢速示例是在使用它在循环开始时索引数组之前立即递减i
。您的快速示例添加了一个介入步骤。如果不知道处理器的内部架构,就不可能确切知道,但最有可能的是处理器在其管道中已经有buffer[i]
,但是减量使该值无效,导致管道停滞。通过介入步骤,它有更多时间在需要之前恢复正确的值。
顺便说一下,mov eax, 5
不是执行i--
的指令。对于我们这些没有编译器的人来说,发布更多的汇编语境会很有帮助。