C++ - 极其奇怪的机器代码行为

C++ - extremely strange machine code behaviour

本文关键字:机器 代码 C++      更新时间:2023-10-16

完整的代码在这里: 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(( 不准确,请更改大小 = 7。在我的机器上,大小 = 7 的差异是 12000ms 与 7000ms。

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

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