我读过各种优化指南,声称ADD 1比在x86中使用Inc.更快。这是真的吗?
发布于 2012-11-15 00:58:08
在一些微体系结构上,对于某些指令流,INC将导致“部分标志更新停顿”(因为它在更新一些标志的同时保留其他标志)。ADD设置所有标志的值,因此不会冒这种停顿的风险。
ADD并不总是比INC快,但它几乎总是一样快(在某些较旧的微体系结构上有一些角落情况,但它们非常罕见),有时还会快得多。
有关更多详细信息,请咨询Intel's Optimization Reference Manual或Agner Fog's micro-architecture notes。
发布于 2016-05-08 10:17:37
虽然这不是一个确定的答案。编写这个C文件:
=== inc.c ===
#include <stdio.h>
int main(int argc, char *argv[])
{
for (int n = 0; n < 1000; n++) {
printf("%d\n", n);
}
return 0;
}然后运行:
clang -march=native -masm=intel -O3 -S -o inc.clang.s inc.c
gcc -march=native -masm=intel -O3 -S -o inc.gcc.s inc.c注意生成的汇编代码。相关clang输出:
mov esi, ebx
call printf
inc ebx
cmp ebx, 1000
jne .LBB0_1相关的gcc输出:
mov edi, 1
inc ebx
call __printf_chk
cmp ebx, 1000
jne .L2这证明了在现代架构中,clang和gcc的作者都认为INC是比ADD reg, 1更好的选择。
这对你的问题意味着什么?好吧,我相信他们对你读过的指南的判断,并得出结论,INC和ADD一样快,由于较短的寄存器编码而节省了一个字节,这使它更可取。编译器的作者只是普通人,所以他们可能是错的,但这不太可能。:)
一些更多的实验表明,如果您不使用-march=native选项,那么gcc将使用add ebx, 1。当otoh,总是喜欢公司最好。我的结论是,当你在2012年问这个问题时,ADD有时是更可取的,但现在到了2016年,你应该总是使用INC。
https://stackoverflow.com/questions/13383407
复制相似问题