C++ - 极其奇怪的机器代码行为
C++ - extremely strange machine code behaviour
完整的代码在这里: 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--
的指令。 对于我们这些没有编译器的人来说,发布更多的程序集上下文会很有帮助。
相关文章:
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 使用不同的链接器会产生不同的机器代码吗
- objdump 不显示机器代码,但显示 ASM
- 从.o目标文件中提取函数的原始机器代码?
- 我在区分源代码、目标代码、汇编代码和机器代码时感到困惑
- 如果C++编译为机器代码,为什么我们需要安装"运行时"?
- 是否可以执行存储在变量中的机器代码
- "Double or Nothing"赌博机器代码无法超过15组合
- 如何在 c++ 中将机器代码作为函数运行
- 可以从文件执行机器代码吗?
- 如何将x64机器代码写入虚拟内存并在C++中为Windows执行
- 如何将高级/低级编程代码直接转换为机器代码
- (如何)我可以使用LLVM机器代码分析器预测代码片段的运行时间
- 如何使用llvm生成机器代码
- 使用LLVM生成纯机器代码
- 注释会被翻译成机器代码吗?C++
- 如何使用c++执行附加在可执行文件末尾的机器代码
- 如何从机器代码中恢复C++尝试/抛出/捕获块长度和地址
- 是否有编译器可以编译为机器代码的 C C++ C# 编译器
- C++ - 极其奇怪的机器代码行为