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语句(而不是它们的内容),那么它会有所帮助。例如,在字节码解释器中可能会发生这种情况。
补充:我喜欢使用
如果你有一个非常大的if-else语句链,那么,是的,你可能会感觉到不同。但是你写这么长的一条ifelse链是不现实的。即使你这样做了,你的性能瓶颈也不太可能出现在这一点上。
首先编写可读的代码,当需要进行性能优化时,让分析器引导您自己。
可能没关系。字节码只是到JVM的一种"传输格式"。在JVM中所发生的事情与字节码表示非常不同。(例如:字节码不提供float操作,所以float+-*/%float作为双操作完成,然后结果被转换回float。同样,对于byte/short,它们被转换为int,然后返回。)但是对于switch,它们是两种字节码格式,一种已经具有跳转表。但老实说:我会选择一种最适合你和你的程序读者的格式。剩下的工作由JVM来完成。如果你太聪明了,你的JVM可能没有得到你的观点,最终程序会变慢。
"我们应该忘记小效率,比如说97%的时间:过早的优化是万恶之源"D.Knuth