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

C++ C++;-极其奇怪的机器代码行为,c++,performance,assembly,machine-code,C++,Performance,Assembly,Machine Code,完整代码如下: 在函数fast_generator中,我为两条语句添加了注释。如果切换这些语句,代码运行速度将提高约1.8倍。如果删除第一条语句,代码的执行速度将比原始版本快,但比切换时慢 测试用例应如下所示 第一,最慢。452ms counter++; i--; 第二个-比第一个快。280毫秒 i--; counter++; 第三个-比第一个快,但比第二个慢。421ms i--; 原始语句的汇编程序输出为 inc edx mov eax, 6 我已经验证过,当切换这些语句时,汇编程序的

完整代码如下:

在函数fast_generator中,我为两条语句添加了注释。如果切换这些语句,代码运行速度将提高约1.8倍。如果删除第一条语句,代码的执行速度将比原始版本快,但比切换时慢

测试用例应如下所示

第一,最慢。452ms

counter++;
i--;
第二个-比第一个快。280毫秒

i--;
counter++;
第三个-比第一个快,但比第二个慢。421ms

i--;
原始语句的汇编程序输出为

inc edx
mov eax, 6
我已经验证过,当切换这些语句时,汇编程序的输出保持不变,只是这些asm指令的唯一区别被交换


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

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


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

列出您的编译选项,否则它不会发生。(适用于任何与性能无关的讨论),但在C++中将<代码> int main(空)<代码> > <代码> int main()/>代码。在这种情况下,对平台的描述,包括处理器模型、RAM速度和容量等也可能有帮助。OK -我能够在核心2机器上复制这个。1@Jesse当前位置你也要“纠正”他的支撑方式吗?这和你的抱怨一样有道理。别告诉我它是拙劣的样式,仅仅因为它是冗余的,C++中的大量冗余被认为是好的样式——在类定义中明确地陈述<代码>私有< /代码>,明确地陈述<代码>虚拟< /C> >重写。等等,实际上,<代码> MOV EAX,5 < /代码>是正确的。如果查看代码,
i
在进入循环时始终为7。所以它等于moveax,6,OP显示5,但他可能只是忘记了改变常数。这并不能解释第三种情况的行为。
计数器+++
似乎在提高速度。mov eax,5确实代表i-,但如果size=6。我编辑了原始帖子,上面写着mov eax,现在6岁。