case-statement或if-statement效率透视

可能重复:
“else if”是否比“switch()case”更快?
Java中if / else与switch语句的相对性能差异是什么?

我知道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; } 

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

如果任何编译器可以validation值是否相当紧凑,那么它将生成跳转表。 (我怀疑他们是否属于这种情况,是10的倍数。)

这是一种微观优化。 微观优化只有在你知道它的情况下才有意义。 通常,在其他地方有更大的“炸鱼”,以函数调用的forms,可以不用。 但是,如果您已经调整了此代码中的日光,并且您的分析显示很多时间(如10%或更多)的时间进入这些IF语句(而不是其内容)那么它会有所帮助。 例如,这可能发生在字节码解释器中。

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

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

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

可能无所谓。 字节码只是JVM的“传输格式”。 JVM与字节码表示有很大不同,会发生什么。 (示例:Bytecode不提供浮点运算,因此float + – * /%float作为double运算完成,然后结果返回到float。对于byte / short也是如此,它们被转换为int然后返回。)但是对于切换,它们是两种字节码格式,一种已经具有跳转表。 但老实说:我会选择最适合您和您的程序读者的格式。 JVM将完成剩下的工作。 如果你太聪明了,JVM可能不会明白你的观点,最后程序会变慢。

“我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源”D. Knuth

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