为什么INC和ADD 1有不同的表现?

时间:2012-08-28 16:29:36

标签: optimization assembly x86 hardware cpu-architecture

多年来我多次读过你应该做XOR ax,ax因为它更快......或者用C编程时使用counter ++或counter + = 1因为它们会INC或ADD ...或者在在Netburst Pentium 4中,INC比ADD 1慢,所以必须警告编译器你的目标是一个Netburst所以它会将所有var ++翻译成ADD 1 ...

我的问题是:为什么INC和ADD有不同的表现?为什么例如INC声称在Netburst上速度较慢而在其他处理器中比ADD快?

2 个答案:

答案 0 :(得分:16)

对于x86架构,INC更新条件代码的子集,而ADD更新整个条件代码集。 (其他架构有不同的规则,因此本讨论可能适用也可能不适用。)

因此,INC指令必须等待更新条件代码位的其他先前指令才能完成,然后才能修改前一个值以产生最终的条件代码结果。

ADD可以生成最终条件代码位,而不考虑条件代码的先前值,因此不需要等待先前的指令来完成计算条件代码的值。

结果:您可以与许多其他指令并行执行ADD,并使用较少的其他指令执行INC。因此,ADD在实践中似乎更快。

(我认为在全宽度寄存器(例如,EAX)的上下文中使用8位寄存器(例如,AL)存在类似的问题,因为AL更新要求先前完成先前的EAX更新)。 / p>

我不再在我的高性能汇编代码中使用INC或DEC。如果您对执行时间不敏感,那么INC或DEC就可以了,可以减小指令流的大小。

答案 1 :(得分:4)

XOR ax, ax位,我收集了几年过时了,现在分配为零(所以我被告知)。

关于counter++而不是counter+=1的C位是过时的几十年。肯定。

第一个装配的简单原因是所有指令都将被转换为CPU的某种操作,而设计师总是试图尽可能快地完成所有操作,他们会与其他人一起做得更好。不难想象INC如何更快,因为它只需要处理一个寄存器,尽管这非常简单(但我对这些事情知之甚少,所以我只能过度简化)一部分)。

但是,C语言很久以前就是胡说八道。如果我们有一个INC击败ADD的特定CPU,那么为什么编译器设计者不会对counter++counter+=1使用INC而不是ADD?编译器做了很多优化,而这种改变远非最复杂的。