现在 6 年后,在仍然偶尔收到来自这个问题的通知之后,我想补充一些我在计算机科学研究期间获得的见解。
把上面的语句放到一个小程序中,然后编译...
public class Comp {
public static void main(String[] args) {
int y = 42;
for(int x = 0; x < y; x++) {
// stop if x >= y
}
for(int x = 0; x != y; x++) {
// stop if x == y
}
}
}
...我们得到以下字节码:
public static void main(java.lang.String[]);
Code:
// y = 42
0: bipush 42
2: istore_1
// first for-loop
3: iconst_0
4: istore_2
5: iload_2
6: iload_1
7: if_icmpge 16 // jump out of loop if x => y
10: iinc 2, 1
13: goto 5
// second for-loop
16: iconst_0
17: istore_2
18: iload_2
19: iload_1
20: if_icmpeq 29 // jump out of loop if x == y
23: iinc 2, 1
26: goto 18
29: return
正如我们所看到的,在字节码级别,两者都以相同的方式处理,并使用单个字节码指令进行比较。
如前所述,如何将字节码翻译成汇编程序/机器码取决于 JVM。但通常这种条件跳转可以翻译成一些汇编代码,如下所示:
; condition of first loop
CMP eax, ebx
JGE label ; jump if eax > ebx
; condition of second loop
CMP eax, ebx
JE label ; jump if eax == ebx
在硬件级别上,JGE 和 JE 具有相同的复杂性。
总而言之:关于性能,两者在硬件级别x < y
上x != y
理论上是相同的,并且一个本身并不比另一个更快或更慢。