为什么JMH使用不同的分叉?

问题描述

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

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

解决方法

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

我了解为什么在某些情况下(例如,下面的情况(从http://java-performance.info/jmh/复制的逐字记录))中这很有用:

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

但是,如果您反复对同一代码进行基准测试,那么运行10个fork(每个20个迭代)而不是1个fork(200个迭代)有什么好处吗?

非常感谢,

丹尼