代码之家  ›  专栏  ›  技术社区  ›  sixtyfootersdude

案例陈述或假设陈述效率视角[副本]

  •  11
  • sixtyfootersdude  · 技术社区  · 15 年前

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

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

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

    5 回复  |  直到 8 年前
        1
  •  35
  •   dcp    15 年前

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

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

    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
  •  4
  •   Mike Dunlavey    15 年前

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

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

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

        3
  •  2
  •   jvdneste    15 年前

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

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

        4
  •  1
  •   Christian Ullenboom    15 年前

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

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

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