非常奇怪的机器代码行为
完整的代码在这里:http://pastebin.com/MM3vWmqA
在函数fast_generator中,我添加了两条语句的注释。 如果您切换这些语句,代码将运行速度加快〜1.8倍。 如果删除第一条语句,代码将比原始版本执行得更快,但与切换后的代码相比要慢一些。
测试用例应该如下。
首先 - 最慢。 452ms。
counter++;
i--;
其次 - 比第一个更快。 280ms。
i--;
counter++;
第三 - 比第一个快,但比第二个慢。 421ms。
i--;
原始语句的汇编程序输出为。
inc edx
mov eax, 6
我已经证实,在切换这些语句时,汇编器输出保持不变,这些汇编指令的唯一区别是互换的。
我已经用VC ++ 10和VC ++ 11测试过了,它的行为一样。 有人可以解释为什么切换这些语句加快算法〜1.8倍? 如果您认为std :: clock()不准确,请更改大小= 7.在我的机器上,大小= 7的差值为12000ms vs 7000ms。
你的缓慢的例子正在递减i
之前立即使用它来索引在循环的开始数组。 您的快速示例添加了一个干预步骤。 在不了解处理器的内部架构的情况下,无法确定地知道,但最可能发生的情况是处理器在其流水线中已经存在buffer[i]
,但递减会使该值无效,从而导致流水线延迟。 通过干预步骤,有更多时间在需要之前恢复正确的值。
顺便说一句, mov eax, 5
不是正在做i--
的指令。 对于我们这些没有编译器的人来说,发布更多的汇编上下文会很有帮助。