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

Java 为什么JMH运行不同的分叉?,java,benchmarking,jmh,Java,Benchmarking,Jmh,我正在使用JMH基准测试框架()在我的代码上运行基准测试。我的理解是,JMH在基准测试期间多次分叉JVM,以便丢弃JVM在执行期间执行的即时(JIT)评测所构建的任何概要文件 我理解为什么这在某些情况下很有用,例如以下(逐字复制自): 默认情况下,JHM为每个试验(一组迭代)分叉一个新的java过程。这是为了保护测试不受先前收集的“概要文件”的影响,这些文件是关于其他加载类及其执行信息的信息。例如,如果您有两个类实现了相同的接口并测试了它们的性能,那么第一个实现(按测试顺序)可能比第二个实现(在

我正在使用JMH基准测试框架()在我的代码上运行基准测试。我的理解是,JMH在基准测试期间多次分叉JVM,以便丢弃JVM在执行期间执行的即时(JIT)评测所构建的任何概要文件

我理解为什么这在某些情况下很有用,例如以下(逐字复制自):

默认情况下,JHM为每个试验(一组迭代)分叉一个新的java过程。这是为了保护测试不受先前收集的“概要文件”的影响,这些文件是关于其他加载类及其执行信息的信息。例如,如果您有两个类实现了相同的接口并测试了它们的性能,那么第一个实现(按测试顺序)可能比第二个实现(在同一JVM中)快,因为在发现第二个实现之后,JIT将对第一个实现的直接方法调用替换为接口方法调用

但是,在重复测试相同代码的情况下,运行10个fork(每个fork包含20次迭代)而不是1个fork(每个fork包含200次迭代)有什么好处吗

非常感谢,


丹尼

一些人坚持认为,使用叉子解决的另一个问题是运行到运行的差异:

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