我想知道如果我可以关闭JIT,为什么我应该使用JMH进行基准测试? JMH是否禁止通过禁用JIT来阻止优化?
答案 0 :(得分:9)
<强> TL; DR;通过在同一轨道上骑自行车来评估一级方程式的表现。
这个问题很奇怪,特别是如果你问自己一个简单的后续问题。在与生产环境截然不同的条件下运行基准测试的重点是什么?换句话说,如何以解释模式运行的知识适用于现实世界?
问题不在于黑白:你需要在实际环境中发生优化,和你需要在某些中小心打破它们选择位置以进行良好的实验设置。这就是JMH正在做的事情:它提供了构建实验设置的方法。 JMH samples很好地解释了错综复杂的情况。
而且,基准测试不仅仅是针对编译器。很多很多非编译器(和非JVM!)问题need to be addressed。当然,它可以手工完成(JMH不是神奇的,它只是一个人工编写的工具),但你将花费大部分时间预算来解决简单的问题,而没有时间去解决非常重要的,特定于您的实验。
答案 1 :(得分:0)
JIT不是防弹和全能的。例如,它不会在某段代码运行一定次数之前启动,或者如果一段字节码太大/太深埋/等,它就不会启动。另外,考虑实时仪器,这通常会阻止JIT操作(想想分析)。
因此,人们仍然希望能够将其关闭或打开;如果一段代码确实是时间关键的,你可能想知道它将如何执行,这取决于JIT是否会启动。
但是这些情况非常罕见,并且随着JVM(因此JIT)的发展而变得越来越罕见。