一个快速问题,假设事前
mov eax, 0哪一个更有效率?
inc eax
inc eax或
add eax, 2另外,在两个inc更快的情况下,编译器(比如说,GCC)是否通常(即没有积极的优化标志)对var += 2进行优化?
PS:不要费心用“不要过早优化”的变体来回答,这只是学术兴趣。
发布于 2011-05-13 22:55:12
同一寄存器上的两条inc指令(或者更一般地说,两条读-修改-写指令)总是至少有两个周期的相关性链。这是假设Inc.的一个时钟延迟,这是自486以来的情况。这意味着如果周围的指令不能与两个inc指令交错来隐藏这些延迟,代码的执行速度将会变慢。
但是没有编译器会发出你建议的指令序列(mov eax,0将被xor eax,eax取代,参见What is the purpose of XORing a register with itself?)
mov eax,0
inc eax
inc eax它将被优化为
mov eax,2发布于 2011-05-13 22:27:46
如果你想知道x86指令的原始性能统计数据,请参阅Dr Agner Fogs listings (确切地说是第4卷)。至于编译器的部分,这取决于编译器的代码生成器,而不是你应该太依赖的东西。
顺便说一句:我发现有趣/讽刺的是,在一个关于性能的问题中,你使用MOV EAX,0而不是XOR EAX,EAX :P将寄存器置零(如果MOV EAX,0是事先完成的,最快的变体将是去掉inc和add而只是MOV EAX,2)。
发布于 2011-05-13 22:27:20
无论出于何种目的,这可能都无关紧要。但要考虑到公司的使用更少的字节。
考虑以下代码:
int x = 0;
x += 2;在不使用任何优化标志的情况下,GCC将此代码编译为:
80483ed: c7 44 24 1c 00 00 00 movl $0x0,0x1c(%esp)
80483f4: 00
80483f5: 83 44 24 1c 02 addl $0x2,0x1c(%esp)使用-O1和-O2,它就变成了:
c7 44 24 08 02 00 00 movl $0x2,0x8(%esp)很好笑,不是吗?
https://stackoverflow.com/questions/5993326
复制相似问题