15

我正在使用 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 次,有什么优势吗?

非常感谢,

丹尼

4

1 回答 1

14

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

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

于 2014-09-01T13:48:46.800 回答