可能的重复:
“else if”比“switch() case”快吗?
Java 中 if/else 与 switch 语句的相对性能差异是什么?
我知道 case 语句可以用跳转表来实现。这是否使它们比 if 语句更有效?
这只是应该避免的微优化吗?
可能的重复:
“else if”比“switch() case”快吗?
Java 中 if/else 与 switch 语句的相对性能差异是什么?
我知道 case 语句可以用跳转表来实现。这是否使它们比 if 语句更有效?
这只是应该避免的微优化吗?
我认为主要是尽可能清楚地编写代码。像这样的微优化不应该是重点。
例如,如果你有这样的事情:
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;
}
同样,我将专注于使代码更易于阅读和维护,而不是纳秒级的效率提升。
任何编译器只要能够验证这些值是否合理紧凑,都会生成跳转表。(我怀疑它们是否在这种情况下,是 10 的倍数。)
这是一个微优化。微优化只有在你知道它的时候才有意义。通常,在其他地方有更大的“炸鱼”,以函数调用的形式可以不用。但是,如果您已经对此代码进行了调整,并且您的分析表明有很大一部分(如 10% 或更多)时间用于这些 IF 语句(而不是它们的内容),那么它会有所帮助。例如,这可能发生在字节码解释器中。
补充:我喜欢使用的另一个原因switch
是,即使它没有制作跳转表 - 在调试器中单步执行代码时,它会直接进入正确的案例,而不是让我单步执行大量错误if
语句。使调试更容易。
如果你有一个非常大的 if else 语句链,那么,是的,你可能会感觉到不同。但是你写这么长的ifelse链是非常不现实的。即使您这样做了,也不太可能成为您的性能瓶颈所在。
首先编写可读的代码,并在需要进行性能优化时让分析器指导自己。
大概无所谓吧。字节码只是 JVM 的一种“传输格式”。JVM 内部发生的事情与字节码表示非常不同。(示例:字节码不提供浮点操作,因此浮点 +-*/% 浮点作为双精度操作完成,然后将结果转换回浮点。字节/短也是如此,它们被转换为 int 然后返回.) 但是对于 switch,它们是两种字节码格式,一种已经带有跳转表。但老实说:我会选择最适合您和您的程序读者的格式。JVM 将完成其余的工作。如果你太聪明,你的 JVM 可能不会明白你的意思,最后程序会变慢。
“我们应该忘记小的效率,比如大约 97% 的时间:过早优化是万恶之源” D. Knuth