可能重复:
What is the relative performance difference of if/else versus switch statement in Java?
考虑以下两种方法:
public static int useSwitch(int i) {
switch (i) {
case 0:
return 1;
default:
return 0;
}
}
public static int useIf(int i) {
if (i == 0)
return 1;
return 0;
}
测试显示,switch
执行速度稍慢(我的计算机上每次调用1.4纳秒),而不是if
版本。
我一直认为,在至少可以避免少数ifs
之前,开关的好处并没有开始,
为什么switch
比单if
更快?
答案 0 :(得分:7)
通过检查字节码,结果符合预期:
<强> SWITCH 强>
public static useSwitch(I)I
L0
ILOAD 0
TABLESWITCH
0: L1
default: L2
L1
INVOKESTATIC Tests.a()I
IRETURN
L2
INVOKESTATIC Tests.b()I
IRETURN
如果强>
public static useIf(I)I
L0
ILOAD 0
IFNE L1
L2
INVOKESTATIC Tests.a()I
IRETURN
L1
INVOKESTATIC Tests.b()I
IRETURN
现在我没有看到任何一个应该比另一个慢的特定原因(在任何情况下都不是有意义的数量)。这肯定是与特定JVM实现以及它如何执行这些操作码相关的东西。根据常识,TABLESWITCH
指令应该更慢,除非有足够的案例使其构造有价值,但这只是常见思维。每个JVM都可以以不同的方式实现它,所以这只是推测。
您确定以一致的方式描述所有内容吗? (通过给JVM提供时间预热,将结果保持在置信范围内以及使得分析足够正确以便使用的所有其他事情)
答案 1 :(得分:0)
此类比较在If-else vs switch – Which is better?中进行了分析。 但是,尝试使用gcj编译为本机代码,并将获得的结果与使用字节码的结果进行比较。