C++ - 非常奇怪的机器代码行为

NFR*_*RCR 7 c++ performance assembly machine-code

完整的代码在这里:http://pastebin.com/MM3vWmqA

在函数fast_generator中,我为两个语句添加了注释.如果切换这些语句,代码运行速度会快1.8倍.如果删除第一个语句,代码将比原始版本执行得更快,但与切换时相比更慢.

测试用例应如下.

第一 - 最慢.452ms.

counter++;
i--;
Run Code Online (Sandbox Code Playgroud)

第二 - 比第一个更快.280ms.

i--;
counter++;
Run Code Online (Sandbox Code Playgroud)

第三 - 比第一个快,但比第二个慢.421ms.

i--;
Run Code Online (Sandbox Code Playgroud)

原始语句的汇编器输出是.

inc edx
mov eax, 6
Run Code Online (Sandbox Code Playgroud)

我已经验证,当切换这些语句时,汇编程序输出保持不变,这些asm指令的唯一区别是互换.

我用VC++ 10和VC++ 11测试过它,行为相同.有人可以解释为什么切换这些语句会加速算法~1.8倍?如果您认为std :: clock()不准确,请更改size = 7.在我的机器上,size = 7的差异是12000ms vs 7000ms.

Kar*_*ldt 3

i您的缓慢示例在使用它在循环开始时索引数组之前立即递减。您的快速示例添加了一个干预步骤。如果不了解处理器的内部架构,就不可能确定,但​​最有可能发生的情况是处理器已经在buffer[i]其管道中,但递减使该值无效,导致管道停顿。通过干预步骤,可以在需要之前有更多时间恢复正确的值。

顺便说一句,mov eax, 5不是执行i--. 对于我们这些没有编译器的人来说,发布更多的汇编上下文会很有帮助。