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

时间:2012-04-04 21:23:02

标签: c++ performance assembly machine-code

完整代码在此处: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。

1 个答案:

答案 0 :(得分:3)

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

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