Java case语句或if语句效率透视图

Java case语句或if语句效率透视图,java,performance,if-statement,case-statement,Java,Performance,If Statement,Case Statement,可能的重复项: 我知道case语句可以用跳转表实现。这是否使它们比if语句更有效 这只是应该避免的微观优化吗 我认为最重要的是尽可能清晰地编写代码。像这样的微优化不应该成为焦点。 例如,如果您有如下内容: if (age == 10) { // ... } else if (age == 20) { // ... } else if (age == 30) { // ... } else if (age == 40) { // ... } 然后使用s

可能的重复项:

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


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

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

例如,如果您有如下内容:

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;
}
同样,我会专注于使代码更易于阅读和维护,而不是提高纳秒级的效率。

  • 不,这是你程序设计的一部分。但是你应该考虑一个过多的方法是否是一个更好的解决方案,一个类型的家庭。
  • 如果你有一个非常大的If-else语句链,那么,是的,你可能会感觉到不同。但是你要写这么长的ifelse链是非常不现实的。即使您这样做了,也不太可能出现性能瓶颈


    首先编写可读的代码,当需要性能优化时,让分析器引导自己。任何编译器都会创建跳转表,如果它能够验证值是否合理紧凑。(我怀疑在这种情况下,它们是否是10的倍数。)

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


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

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


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

    Dupe of、,等等。这不是dup,因为这个问题是java特有的。实际上你是对的。这是一个骗局。但它不是其他的dup,因为它们不是java特定的。恼人的是,效率和性能是如何不同的标签。