首页
学习
活动
专区
圈层
工具
发布

x86
EN

Stack Overflow用户
提问于 2012-11-15 00:53:41
回答 2查看 7K关注 0票数 19

我读过各种优化指南,声称ADD 1比在x86中使用Inc.更快。这是真的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-15 00:58:08

在一些微体系结构上,对于某些指令流,INC将导致“部分标志更新停顿”(因为它在更新一些标志的同时保留其他标志)。ADD设置所有标志的值,因此不会冒这种停顿的风险。

ADD并不总是比INC快,但它几乎总是一样快(在某些较旧的微体系结构上有一些角落情况,但它们非常罕见),有时还会快得多。

有关更多详细信息,请咨询Intel's Optimization Reference ManualAgner Fog's micro-architecture notes

票数 31
EN

Stack Overflow用户

发布于 2016-05-08 10:17:37

虽然这不是一个确定的答案。编写这个C文件:

代码语言:javascript
复制
=== inc.c ===
#include <stdio.h>
int main(int argc, char *argv[])
{
    for (int n = 0; n < 1000; n++) {
        printf("%d\n", n);
    }
    return 0;
}

然后运行:

代码语言:javascript
复制
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输出:

代码语言:javascript
复制
mov     esi, ebx
call    printf
inc     ebx
cmp     ebx, 1000
jne     .LBB0_1

相关的gcc输出:

代码语言:javascript
复制
mov     edi, 1
inc     ebx
call    __printf_chk
cmp     ebx, 1000
jne     .L2

这证明了在现代架构中,clang和gcc的作者都认为INC是比ADD reg, 1更好的选择。

这对你的问题意味着什么?好吧,我相信他们对你读过的指南的判断,并得出结论,INCADD一样快,由于较短的寄存器编码而节省了一个字节,这使它更可取。编译器的作者只是普通人,所以他们可能是错的,但这不太可能。:)

一些更多的实验表明,如果您不使用-march=native选项,那么gcc将使用add ebx, 1。当otoh,总是喜欢公司最好。我的结论是,当你在2012年问这个问题时,ADD有时是更可取的,但现在到了2016年,你应该总是使用INC

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13383407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档