2010-08-02 86 views
9

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

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

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

+2

杜佩的[是“否则,如果”不是“切换更快速()情况“?](http://stackoverflow.com/questions/767821/is-else-if-faster-than-switch-case),[Java中的if/else与switch语句的相对性能差异是什么?]( http://stackoverflow.com/questions/2086529/what-is-the-relative-performance-difference-of-if-else-versus-switch-statement-in),[If vs. Switch Speed](http:///stackoverflow.com/questions/445067/if-vs-switch-speed)等。 – BalusC 2010-08-02 13:05:48

+0

这不是一个dup,因为这个问题是java特定的。 – sixtyfootersdude 2010-08-02 13:09:14

+1

其实你是对的。这是http://stackoverflow.com/questions/2086529/what-is-the-relative-performance-difference-of-if-else-versus-switch-statement-in的副本。这不是别人的重复,因为它们不是java特有的。讨厌效率和性能如何不同的标签。 – sixtyfootersdude 2010-08-02 13:13:02

回答

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

同样,我将专注于使该代码最容易阅读和维护,而不是纳秒级的效率提升。

0
  1. 不,这是你的程序设计的一部分。但是,你应该考虑一种可以超越的方法是否可能不是一个更好的解决方案,而且是一个类型族。
2

如果你有一个很大 if if else语句的链,那么,是的,你可能会感觉到不同。但是你会写出如此长的连锁链是非常不现实的。如果即使你做了,仍然不太可能出现性能瓶颈。

将您的代码编写为首先可读,并在性能优化需求出现时让您自己接受分析器的指导。

3

如果可以验证这些值合理紧凑,任何编译器都会创建跳转表。 (我怀疑他们是否在这种情况下,是10的倍数。)

这是一个微型优化。微型优化只有在你知道的情况下才有意义。通常情况下,其他地方有更大的“鱼苗”,以函数调用的形式存在,可以不用。但是,如果您已经从代码中调整了日光,并且您的配置文件显示,这些IF语句(而不是其内容)中有一小部分时间(如10%或更多)会有帮助。例如,这可能发生在字节码解释器中。

添加:我喜欢使用switch的另一个原因是,即使它没有创建跳转表 - 在调试器中单步执行代码时,它会直接转到正确的情况,而不是让我一步步完成很多虚假的if声明。使其更易于调试。

1

可能不重要。字节码只是JVM的一种“传输格式”。 JVM与字节码表示有很大区别。(例如:字节码不提供浮动操作,所以float + - * /%float是作为双重操作完成的,然后结果返回浮动状态。对于字节/短整数也是如此,它们被转换为int,然后返回)但是对于开关它们是两个字节码格式,其中一个已经有一个跳转表。但说实话:我会选择一种最适合你和你的节目的读者的格式。 JVM将完成剩下的工作。如果你太聪明,你的JVM可能不明白你的观点,最后程序会变慢。

“我们应该忘记小的效率,讲的时候约97%:过早的优化是万恶之根” D.克努特