可能重复:
Is "else if" faster than "switch() case"?
What is the relative performance difference of if/else versus switch statement in Java?
我知道可以使用跳转表实现case语句。这是否比if语句更有效?
这只是应该避免的微优化吗?
答案 0 :(得分:35)
我认为最重要的是尽可能清楚地编写代码。像这样的微观优化不应成为焦点。
例如,如果你有这样的东西:
if (age == 10) {
// ...
} else if (age == 20) {
// ...
} else if (age == 30) {
// ...
} else if (age == 40) {
// ...
}
然后使用switch语句更清楚:
switch (age) {
case 10:
// ...
break;
case 20:
// ...
break;
case 30:
// ...
break;
case 40:
// ...
break;
}
同样,我会专注于使代码最容易阅读和维护,而不是纳秒级别的效率提升。
答案 1 :(得分:4)
如果任何编译器可以验证值是否相当紧凑,那么它将生成跳转表。 (我怀疑他们是否属于这种情况,是10的倍数。)
这是微观优化。微观优化只有在你知道它的情况下才有意义。通常,在其他地方有更大的“炸鱼”,以函数调用的形式,可以不用。但是,如果您已经调整了此代码中的日光,并且您的分析显示很多时间(如10%或更多)的时间进入这些IF语句(而不是其内容)那么它会有所帮助。例如,这可能发生在字节码解释器中。
补充:我喜欢使用switch
的另一个原因是,即使它没有制作跳转表 - 当在调试器中单步执行代码时,它会直接转到正确的情况,而不是让我逐步执行大量虚假if
语句。使调试更容易。
答案 2 :(得分:2)
如果你有一个非常大的 if else语句链,那么,是的,你可能会感觉到不同。但你永远不会写出这么长的ifelse链是非常不现实的。即使你做了,但这仍然不太可能是你的性能瓶颈所在。
将您的代码编写为首先可读,并在需要进行性能优化时让自己受分析器的指导。
答案 3 :(得分:1)
可能无所谓。字节码只是JVM的“传输格式”。 JVM与字节码表示非常不同,会发生什么。 (示例:Bytecode不提供浮点运算,因此float + - * /%float作为double操作完成,然后将结果转换回float。对于byte / short也是如此,它们被转换为int然后返回但是对于切换,它们是两种字节码格式,一种已经具有跳转表。但老实说:我会选择最适合您和您的程序读者的格式。 JVM将完成剩下的工作。如果你太聪明了,你JVM可能不会明白你的观点,最后程序会变慢。
“我们应该忘记小的效率,比如大约97%的时间:过早的优化是所有邪恶的根源”D. Knuth
答案 4 :(得分:0)