if (a < 901)
比if (a <= 900)
快吗?
与这个简单示例不完全一样,但是循环复杂代码的性能稍有变化。我想这与生成的机器代码有关,以防万一。
最佳答案
不,在大多数架构上它不会更快。您没有指定,但是在x86上,所有整数比较通常都将在两条机器指令中实现:
test
或cmp
指令,用于设置EFLAGS
Jcc
(jump) instruction,取决于比较类型(和代码布局):jne
-如果不相等则跳转-> ZF = 0
jz
-如果为零(等于)则跳转-> ZF = 1
jg
-如果更大则跳转-> ZF = 0 and SF = OF
示例(为简洁起见进行编辑)已与
$ gcc -m32 -S -masm=intel test.c
一起编译 if (a < b) {
// Do something 1
}
编译为:
mov eax, DWORD PTR [esp+24] ; a
cmp eax, DWORD PTR [esp+28] ; b
jge .L2 ; jump if a is >= b
; Do something 1
.L2:
和
if (a <= b) {
// Do something 2
}
编译为:
mov eax, DWORD PTR [esp+24] ; a
cmp eax, DWORD PTR [esp+28] ; b
jg .L5 ; jump if a is > b
; Do something 2
.L5:
因此,两者之间的唯一区别是
jg
与jge
指令。两者将花费相同的时间。我想指出的是,没有任何内容表明不同的跳转指令花费相同的时间。回答这个问题有些棘手,但是我可以提供以下信息:在Intel Instruction Set Reference中,它们都按照一个共同的指令
Jcc
(如果满足条件则跳转)组合在一起。在附录C.延迟和吞吐量中的Optimization Reference Manual下将相同的分组一起进行。Jcc
的值是: Latency Throughput
Jcc N/A 0.5
在
Jcc
上有以下脚注:因此,英特尔文档中的任何内容都不会与其他
Jcc
指令区别对待。如果考虑用于实现指令的实际电路,则可以假定
EFLAGS
的不同位上将存在简单的AND/OR门,以确定是否满足条件。这样,没有理由测试一个两位的指令所花费的时间要比一个测试一个位所花费的时间更多或更少(忽略门传播延迟,这比时钟周期要短得多)。编辑:浮点
x87浮点数也是如此:(与上面的代码几乎相同,但是使用
double
而不是int
。) fld QWORD PTR [esp+32]
fld QWORD PTR [esp+40]
fucomip st, st(1) ; Compare ST(0) and ST(1), and set CF, PF, ZF in EFLAGS
fstp st(0)
seta al ; Set al if above (CF=0 and ZF=0).
test al, al
je .L2
; Do something 1
.L2:
fld QWORD PTR [esp+32]
fld QWORD PTR [esp+40]
fucomip st, st(1) ; (same thing as above)
fstp st(0)
setae al ; Set al if above or equal (CF=0).
test al, al
je .L5
; Do something 2
.L5:
leave
ret
关于c++ - <快于<=吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12135518/