java - jit 会优化分支太少的 switch 语句吗?

标签 java switch-statement jit

最近我遇到了一个静态代码分析工具 (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


如果这个问题“只是无聊的好奇心”,那就这样吧。

但是,还应指出,出于性能原因重写代码以使用 switchif 可能不是一个好主意和/或浪费时间。

  • 这可能是浪费时间,因为原始版本和手动优化版本之间的时间差异(如果有的话)很可能是微不足道的。

  • 这是个坏主意,因为您的优化可能只对特定的硬件和 JVM 组合有帮助。在其他人身上,它可能没有效果……甚至是反优化。

简而言之,即使您知道 JIT 优化器如何处理此问题,您也可能不应该在编程中考虑它。

(当然,当您遇到真正可衡量的性能问题时,异常(exception)情况是,分析指出(比如)3 分支 switch 是瓶颈之一。)

关于java - jit 会优化分支太少的 switch 语句吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12387128/

相关文章:

java - 模拟 OutputStream#flush 方法

java - 使用扫描仪读取

Java JIT 编译可以在返回始终相同的值时优化方法吗?

python - 将某种类型的 0 添加到局部变量时,Numba 抖动会改变结果

Java 嵌入式静态接口(interface)

java - 断言复杂对象时的 Junit 最佳实践

java - UserTransaction.rollback 异常 HHH000451

java - 如何在 switch 语句输出中添加空格?

jquery - 为jquery样式切换添加cookie

Java:手动展开的循环仍然比原始循环快。为什么?