最近我遇到了一个静态代码分析工具 (PMD) 提示 switch
语句分支太少的情况。它建议将它变成一个 if 语句,我不想这样做,因为我知道很快就会添加更多的案例。但我想知道 javac
是否执行了这样的优化。我使用 JAD 反编译了代码,但它仍然显示一个开关。这可能是 JIT 优化的运行时吗?
更新:请不要被我问题的上下文所误导。我不是在询问 PMD,我不是在询问是否需要进行微优化等。问题显然只有这个:当前(Oracle 1.6.x)JVM 实现是否包含一个 JIT,它也处理开关是否有几个分支。
最佳答案
确定 JIT 编译器如何优化 switch 语句的方法是:
- 阅读 JIT 编译器源代码(OpenJDK 6 和 7 是开源的),或者
- 使用开关运行 JVM,该开关指示将感兴趣的类的 JIT 编译代码转储到文件中。
请注意,与所有与性能和优化相关的问题一样,答案取决于硬件平台以及 JVM 供应商和版本。
引用:Disassemble Java JIT compiled native bytecode
如果这个问题“只是无聊的好奇心”,那就这样吧。
但是,还应指出,出于性能原因重写代码以使用 switch
或 if
可能不是一个好主意和/或浪费时间。
这可能是浪费时间,因为原始版本和手动优化版本之间的时间差异(如果有的话)很可能是微不足道的。
这是个坏主意,因为您的优化可能只对特定的硬件和 JVM 组合有帮助。在其他人身上,它可能没有效果……甚至是反优化。
简而言之,即使您知道 JIT 优化器如何处理此问题,您也可能不应该在编程中考虑它。
(当然,当您遇到真正可衡量的性能问题时,异常(exception)情况是,分析指出(比如)3 分支 switch
是瓶颈之一。)
关于java - jit 会优化分支太少的 switch 语句吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12387128/