如果可以关闭 JIT,为什么还要使用 JMH?

Why use JMH if you can switch off JIT?

我想知道如果可以关闭 JIT,为什么还要使用 JMH 进行基准测试? JMH 是否不抑制可以通过禁用 JIT 来阻止的优化?

JIT 并不是万能的。比如某段代码运行一定次数之前不踢,或者某段字节码太large/too深buried/etc不踢。 .此外,考虑实时检测,它通常会阻止 JIT 运行(想想分析)。

因此,兴趣仍然在于能够将其关闭或打开;如果一段代码确实是时间关键的,您可能想知道它的执行情况取决于 JIT 是否启动。

但这些情况非常罕见,并且随着 JVM(因此是 JIT)的发展而变得越来越少。

TL;DR;通过在同一赛道上骑自行车来评估一级方程式的表现。

这个问题很奇怪,特别是如果你问自己一个简单的后续问题。在与您的生产环境截然不同的条件下,运行 基准测试有何意义?换句话说,如何将在解释模式下获得的知识 运行 应用于现实世界?

这里的问题不是非黑即白:您需要优化发生在现实世界中,您需要它们在一些 精心挑选的 地方损坏,以进行良好的实验设置。这就是 JMH 正在做的事情:它提供了构建实验装置的方法。 JMH samples 很好地解释了复杂性和场景。

而且,基准测试不仅仅是与编译器作斗争。很多很多非编译器(和非 JVM!)问题 need to be addressed。当然,它可以手工完成(JMH 并不神奇,它只是一个同样由人类编写的工具),但是您将花费大部分时间预算来解决简单的问题,而没有时间解决 非常重要,特定于您的实验。