如果(a<;901)比如果(a<;=900)快吗
与这个简单的示例不完全一样,但循环复杂代码的性能略有变化。我想这与生成的机器代码有关,以防它是真的
不,在大多数体系结构上它不会更快。您没有指定,但在x86上,所有整数比较通常将在两条机器指令中实现:
- 一种
test或cmp指令,用于设置EFLAGS - 和
Jcc(跳转)指令,具体取决于比较类型(和代码布局):jne-如果不相等,则跳转–>ZF=0jz-如果零(相等)–>ZF=1,则跳转jg-如果大于-->ZF=0且SF=OF- (等等……)
示例(为简洁而编辑)使用$gcc-m32-S-masm=intel test.c编译
if(a<;b){
//做点什么
}
汇编至:
mov-eax,DWORD-PTR[esp+24];A.
cmp eax,DWORD PTR[esp+28];B
jge.L2;如果a为>;=B
; 做点什么
.L2:
及
if(a<;=b){
//做点什么2
}
汇编至:
mov-eax,DWORD-PTR[esp+24];A.
cmp eax,DWORD PTR[esp+28];B
jg.L5;如果a为>;B
; 做点什么2
.L5:
因此,两者之间的唯一区别是jg指令与jge指令。这两种方法需要相同的时间
我想指出的是,没有任何东西表明不同的跳转指令需要相同的时间。这个问题回答起来有点棘手,但我可以给出以下内容:在“英特尔指令集参考”中,它们都分组在一条公共指令下,Jcc(如果满足条件,则跳转)。在附录C“延迟和吞吐量”中的“优化参考手册”中将相同的分组放在一起
延迟-所需的时钟周期数
执行核心完成该表单中所有μ操作的执行
指示吞吐量-所需的时钟周期数
等待问题端口可以自由接受相同的指令
再一次对于许多指令,一条指令的吞吐量可以是
明显小于其延迟时间
Jcc的值为:
延迟吞吐量
Jcc不适用0.5
在Jcc上添加以下脚注:
7) 条件跳转指令的选择应基于第3.4.1节“分支预测优化”的建议,以提高分支的可预测性。当成功预测分支时,
jcc的延迟实际上为零
因此,在英特尔文档中,任何一条Jcc指令都没有区别于其他指令
如果考虑用于实现指令的实际电路,可以假设在EFLAGS中的不同位上有简单的和/或门,以确定是否满足条件。因此,测试两个位的指令没有理由比只测试一个位的指令花费更多或更少的时间(忽略门传播延迟,它远小于时钟周期)
编辑:浮点
这同样适用于x87浮点:(与上面的代码几乎相同,但是使用了double而不是int)
fld QWORD PTR[esp+32]
fld QWORD PTR[esp+40]
fucomip st,st(1);比较ST(0)和ST(1),并在EFLAGS中设置CF、PF、ZF
fstp st(0)
刚毛;如果高于(CF=0和ZF=0),则设置al。
测试铝,铝
乙脑L2
; 做点什么
.L2:
fld QWORD PTR[esp+32]
fld QWORD PTR[esp+40]
fucomip st,st(1);(同上)
fstp st(0)
刚毛;如果高于或等于(CF=0),则设置al。
测试铝,铝
je.L5
; 做点什么2
.L5:
离开
ret