为什么JMH会运行不同的叉子?

时间:2014-08-29 16:55:04

标签: java benchmarking jmh

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

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

  

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

但是,如果您反复对同一代码进行基准测试,那么运行10个分别为20次迭代的分叉而不是1次分叉200次迭代是否有任何优势?

非常感谢,

丹尼

1 个答案:

答案 0 :(得分:12)

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

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