为什么JMH运行不同的分叉?

2022-09-03 14:57:30

我正在使用JMH基准测试框架(http://openjdk.java.net/projects/code-tools/jmh/)在我的代码上运行基准测试。我的理解是,JMH 在基准测试期间多次分叉 JVM,以便丢弃由 JVM 在执行期间执行的实时 (JIT) 分析构建的任何配置文件。

我理解为什么这在某些情况下很有用,例如以下内容(逐字复制自 http://java-performance.info/jmh/):

默认情况下,JHM 为每个试验(一组迭代)分叉一个新的 java 进程。这是保护测试免受以前收集的“配置文件”(有关其他已加载类及其执行信息的信息)的影响所必需的。例如,如果您有 2 个类实现同一个接口并测试它们的性能,则第一个实现(按测试顺序)可能比第二个实现(在同一 JVM 中)更快,因为 JIT 在发现第二个实现后,用接口方法调用替换了对第一个实现的直接方法调用。

但是,在重复对相同代码进行基准测试的情况下,运行 10 个分叉(每个分叉 20 次迭代)而不是 1 个分叉(每次 200 次迭代)有什么好处吗?

非常感谢,

丹尼


答案 1

有些人坚持认为,使用分叉解决的另一个问题是运行到运行方差:http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_13_RunToRun.java

但是,任何认真的工程师都必须能够对基准测试环境进行充分的控制,以消除运行之间的任何差异。看到人们使用分叉来克服他们的懒惰或对基准实际如何执行缺乏理解是令人沮丧的。


答案 2

推荐