非常奇怪的机器代码行为

完整的代码在这里: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--的指令。 对于我们这些没有编译器的人来说,发布更多的汇编上下文会很有帮助。

链接地址: http://www.djcxy.com/p/10633.html

上一篇: extremely strange machine code behaviour

下一篇: django admin login not redirecting