7

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

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

测试用例应该如下。

第一 - 最慢。452 毫秒。

counter++;
i--;

第二 - 比第一个更快。280 毫秒。

i--;
counter++;

第三 - 比第一个快,但比第二个慢。421 毫秒。

i--;

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

inc edx
mov eax, 6

我已经验证,在切换这些语句时,汇编器输出保持不变,这些 asm 指令的唯一区别是互换了。

我已经用 VC++10 和 VC++11 对其进行了测试,行为相同。有人能解释一下为什么切换这些语句会加速算法 ~ 1.8 倍吗?如果您认为 std::clock() 不准确,请更改 size = 7。在我的机器上,size = 7 的差异是 12000 毫秒与 7000 毫秒。

4

1 回答 1

3

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

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

于 2012-04-04T22:13:44.063 回答