问题 为什么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次迭代是否有任何优势?

非常感谢,

丹尼


10888
2017-08-29 16:55


起源



答案:


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

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


11
2017-09-01 13:48