快速的问题,事先假定相对业绩加指令
mov eax, 0
这是更有效?
inc eax
inc eax
或
add eax, 2
此外,在情况下,两个inc
s为更快,做编译器(就是说,GCC)通常(即,W/O积极的优化标志)优化var += 2
呢?
谢谢你的时间! PS:不要用“不过早优化”的变体来回答,这只是学术上的兴趣。
快速的问题,事先假定相对业绩加指令
mov eax, 0
这是更有效?
inc eax
inc eax
或
add eax, 2
此外,在情况下,两个inc
s为更快,做编译器(就是说,GCC)通常(即,W/O积极的优化标志)优化var += 2
呢?
谢谢你的时间! PS:不要用“不过早优化”的变体来回答,这只是学术上的兴趣。
出于所有目的,它可能没有关系。但考虑到公司使用较少的字节。
考虑下面的代码:
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)
有趣,不是吗?
如果您想知道raw x86指令的性能统计信息,请参阅Dr Agner Fogs listings(第4卷精确)。至于关于编译器的部分,那依赖于编译器的代码生成器,而不是你应该依赖太多的东西。
在一个侧面说明:我觉得很有趣/讽刺的是,在对性能问题,你用MOV EAX,0
零寄存器,而不是XOR EAX,EAX
:P(如果MOV EAX,0
是事先完成,最快的变异会删除公司的和添加的,只是MOV EAX,2
)。
+1为Agner雾;-) – hirschhornsalz 2012-11-15 00:22:13
在同一个寄存器(或者更一般地说是两个读 - 修改 - 写指令)上的两条指令总是有一个至少有两个周期的依赖链。这是假设一个公司的一个时钟等待时间,这是自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
将optimizied到
mov eax,2
请注意'xor eax,eax;尽管如此,inc eax'比大多数编译器的'mov eax,1'更受青睐。可能是因为它是3字节而不是5。 – Polynomial 2013-08-15 22:27:00
@Polynomial如果'mov eax,0'可以用2个字节编码,那么'mov eax,1'也可以用2个字节编码(1个操作码+ 1个立即数) – 2014-05-26 13:56:33
@LưuVĩnhPhúc'mov eax,1'为5个字节:'b8 01 00 00 00'。由于8字节的文字和QWORD前缀:'48 b8 01 00 00 00 00 00 00 00',因此64位是10个字节。比较而言,'xor rax,rax; inc eax'只有5个字节:'48 31 c0 ff c0' – Polynomial 2014-05-26 22:27:00
从英特尔的手册,你可以找到here它看起来像ADD/SUB指令在一个特定的架构上便宜了半个周期。但请记住,英特尔对其最新处理器使用无序执行模式。这主要意味着,无论处理器何时需要等待数据进入(例如,在L1/L2/L3/RAM数据获取期间耗尽事物),都会出现性能瓶颈。所以如果你是个人档案,告诉你INC可能是问题;从数据吞吐的角度来看它,而不是看着原始的周期数。
Instruction Latency1 Throughput Execution Unit
2
CPUID 0F_3H 0F_2H 0F_3H 0F_2H 0F_2H
ADD/SUB 1 0.5 0.5 0.5 ALU
[...]
DEC/INC 1 1 0.5 0.5 ALU
IIRC 0f_2h是P4普雷斯科特,他可以安息。这些半时钟延迟是由内部双时钟管道产生的。对英特尔来说,这是一个非常糟糕的主意。 – hirschhornsalz 2011-05-13 15:06:03
答案可能是特定于处理器的,在大多数情况下,很可能没有可测量的差异。如果您真的*有兴趣知道某个特定CPU的答案,然后对其进行基准测试。 – 2011-05-13 14:32:42
可能重复[ADD 1真的比INC快吗? x86](http://stackoverflow.com/questions/13383407/is-add-1-really-faster-than-inc-x86) – 2017-05-21 10:26:01