首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >x86 Inc.与add指令的相对性能

x86 Inc.与add指令的相对性能
EN

Stack Overflow用户
提问于 2011-05-13 22:22:08
回答 4查看 8.7K关注 0票数 11

一个快速问题,假设事前

代码语言:javascript
复制
mov eax, 0

哪一个更有效率?

代码语言:javascript
复制
inc eax
inc eax

代码语言:javascript
复制
add eax, 2

另外,在两个inc更快的情况下,编译器(比如说,GCC)是否通常(即没有积极的优化标志)对var += 2进行优化?

PS:不要费心用“不要过早优化”的变体来回答,这只是学术兴趣。

EN

回答 4

Stack Overflow用户

发布于 2011-05-13 22:55:12

同一寄存器上的两条inc指令(或者更一般地说,两条读-修改-写指令)总是至少有两个周期的相关性链。这是假设Inc.的一个时钟延迟,这是自486以来的情况。这意味着如果周围的指令不能与两个inc指令交错来隐藏这些延迟,代码的执行速度将会变慢。

但是没有编译器会发出你建议的指令序列(mov eax,0将被xor eax,eax取代,参见What is the purpose of XORing a register with itself?)

代码语言:javascript
复制
mov eax,0
inc eax
inc eax

它将被优化为

代码语言:javascript
复制
mov eax,2
票数 20
EN

Stack Overflow用户

发布于 2011-05-13 22:27:46

如果你想知道x86指令的原始性能统计数据,请参阅Dr Agner Fogs listings (确切地说是第4卷)。至于编译器的部分,这取决于编译器的代码生成器,而不是你应该太依赖的东西。

顺便说一句:我发现有趣/讽刺的是,在一个关于性能的问题中,你使用MOV EAX,0而不是XOR EAX,EAX :P将寄存器置零(如果MOV EAX,0是事先完成的,最快的变体将是去掉inc和add而只是MOV EAX,2)。

票数 14
EN

Stack Overflow用户

发布于 2011-05-13 22:27:20

无论出于何种目的,这可能都无关紧要。但要考虑到公司的使用更少的字节。

考虑以下代码:

代码语言:javascript
复制
int x = 0;
x += 2;

在不使用任何优化标志的情况下,GCC将此代码编译为:

代码语言:javascript
复制
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,它就变成了:

代码语言:javascript
复制
c7 44 24 08 02 00 00    movl   $0x2,0x8(%esp)

很好笑,不是吗?

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

https://stackoverflow.com/questions/5993326

复制
相关文章

相似问题

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