【问题标题】:case-statement or if-statement efficiency perspective [duplicate]case-statement 或 if-statement 效率视角 [重复]
【发布时间】:2010-08-02 12:29:27
【问题描述】:

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

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

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

【问题讨论】:

标签: java performance if-statement case-statement


【解决方案1】:

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

例如,如果你有这样的事情:

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;
}

再次强调,我将专注于使代码更易于阅读和维护,而不是提高纳秒级的效率。

【讨论】:

    【解决方案2】:

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

    这是一个微优化。微优化只有在你知道它的时候才有意义。通常,其他地方有更大的“炸鱼”,以函数调用的形式可以不用。但是,如果您已经对此代码进行了调整,并且您的分析表明有很大一部分(如 10% 或更多)时间用于这些 IF 语句(而不是它们的内容),那么它会有所帮助。例如,这可能发生在字节码解释器中。

    补充:我喜欢使用switch 的另一个原因是,即使它没有生成跳转表 - 在调试器中单步执行代码时,它会直接转到正确的情况,而不是让我单步执行很多错误的if 陈述。更容易调试。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        可能没关系。字节码只是 JVM 的一种“传输格式”。 JVM 内部发生的事情与字节码表示非常不同。 (示例:字节码不提供浮点操作,因此浮点 +-*/% 浮点作为双精度操作完成,然后将结果转换回浮点。字节/短也是如此,它们被转换为 int 然后返回.) 但是对于 switch,它们是两种字节码格式,一种已经带有跳转表。但老实说:我会选择最适合您和您的程序读者的格式。 JVM 将完成其余的工作。如果你太聪明,你的 JVM 可能不会明白你的意思,最后程序会变慢。

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

        【讨论】:

          【解决方案5】:
          1. 是的
          2. 不,这是您程序设计的一部分。但是您应该考虑一个可覆盖的方法是否可能不是更好的解决方案,它具有一系列类型。

          【讨论】:

            猜你喜欢
            • 2011-07-24
            • 2016-04-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-12-26
            • 2012-09-21
            相关资源
            最近更新 更多