x86 inc与add指令的相对性能
快速的问题,预先假设
mov eax, 0
哪个更有效率?
inc eax
inc eax
要么
add eax, 2
另外,如果两个inc
更快,编译器(比如GCC)通常(即没有激进的优化标志)优化var += 2
?
谢谢你的时间!
PS:不用费心去回答“不要过早优化”的变体,这只是学术上的兴趣。
在同一个寄存器上的两个inc
指令(或者更一般地说是两个读 - 修改 - 写指令)总是具有至少两个周期的依赖链。 这是假设一个公司的一个时钟等待时间,这是自486以来的情况。这意味着如果周围的指令不能与两个inc指令交错来隐藏这些等待时间,则代码将会执行得更慢。
但是没有编译器会发出你建议的指令序列( mov eax,0
将被xor eax,eax
替代,请参阅XOR注册自己的目的是什么?)
mov eax,0
inc eax
inc eax
它会被优化
mov eax,2
如果您想知道x86指令的原始性能统计信息,请参阅Agner Fogs博士列表(第4卷精确)。 至于关于编译器的部分,那依赖于编译器的代码生成器,而不是你应该依赖太多的东西。
在一个侧面说明:我觉得有趣/有讽刺意味的是,在一个关于性能的问题中,你使用MOV EAX,0
来替代寄存器而不是XOR EAX,EAX
:P(如果MOV EAX,0
是事先做好的,将删除公司的和添加的,只是MOV EAX,2
)。
出于所有目的,它可能没有关系。 但考虑到公司使用更少的字节。
考虑下面的代码:
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)
很好笑,不是吗?
链接地址: http://www.djcxy.com/p/85927.html上一篇: Relative performance of x86 inc vs. add instruction
下一篇: x86 Assembly: INC and DEC instruction and overflow flag