关于JAVA:case语句或if语句效率透视

case-statement or if-statement efficiency perspective

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicates:
Is"else if" faster than"switch() case"?
What is the relative performance difference of if/else versus switch statement in Java?

我知道case语句可以用跳转表实现。这是否比if语句更有效?

这只是应该避免的微观优化吗?


我认为主要的事情是尽可能清楚地编写代码。像这样的微观优化不应该成为焦点。

例如,如果您有类似的内容:

1
2
3
4
5
6
7
8
9
if (age == 10) {
  // ...  
} else if (age == 20) {
  // ...  
} else if (age == 30) {
  // ...  
} else if (age == 40) {
  // ...  
}

然后更清楚地使用switch语句:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
switch (age) {
    case 10:
        // ...
        break;
    case 20:
        // ...
        break;
    case 30:
        // ...
        break;
    case 40:
        // ...
        break;
}

再次强调,我将重点放在使代码易于阅读和维护,而不是纳米二级效率的提高。


如果任何编译器能够验证这些值是否合理紧凑,那么它都将生成跳转表。(我怀疑他们是否在这种情况下,是10的倍数。)

这是一个微观优化。只有当你知道微观优化是有意义的。通常,在其他地方会有更大的"要炒的鱼",以函数调用的形式,不需要函数调用就可以完成。但是,如果您已经从这段代码中调优了daylights,并且您的分析显示,很好的一部分时间(如10%或更多)正在进入这些if语句(而不是它们的内容),那么它会有所帮助。例如,在字节码解释器中可能会发生这种情况。

补充:我喜欢使用switch的另一个原因是,即使它不构成跳转表——在调试器中单步执行代码时,它直接进入正确的情况,而不是让我单步执行大量错误的if语句。使调试更容易。


如果你有一个非常大的if-else语句链,那么,是的,你可能会感觉到不同。但是你写这么长的一条ifelse链是不现实的。即使你这样做了,你的性能瓶颈也不太可能出现在这一点上。

首先编写可读的代码,当需要进行性能优化时,让分析器引导您自己。


可能没关系。字节码只是到JVM的一种"传输格式"。在JVM中所发生的事情与字节码表示非常不同。(例如:字节码不提供float操作,所以float+-*/%float作为双操作完成,然后结果被转换回float。同样,对于byte/short,它们被转换为int,然后返回。)但是对于switch,它们是两种字节码格式,一种已经具有跳转表。但老实说:我会选择一种最适合你和你的程序读者的格式。剩下的工作由JVM来完成。如果你太聪明了,你的JVM可能没有得到你的观点,最终程序会变慢。

"我们应该忘记小效率,比如说97%的时间:过早的优化是万恶之源"D.Knuth


  • 是的
  • 不,它是程序设计的一部分。但是,您应该考虑一下,对于一系列类型,一个可覆盖的方法是否可能不是更好的解决方案。