case-statement或if-statement效率视角

时间:2010-08-02 12:29:27

标签: java performance if-statement case-statement

  

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

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

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

5 个答案:

答案 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)

  1. 不,这是您的计划设计的一部分。但你应该考虑一个过度可行的方法是否可能不是一个更好的解决方案,有一系列类型。