我通过 JMH 运行一些基准测试
假设我在一个 Java 文件中列出了三个基准
@Benchmark
@Threads(value = 2)
@Warmup(iterations = 10)
@Fork(value = 2)
@Measurement(iterations = 10)
public String benchmarkA() {
...
}
@Benchmark
@Threads(value = 2)
@Warmup(iterations = 10)
@Fork(value = 2)
@Measurement(iterations = 10)
public String benchmarkB() {
...
}
@Benchmark
@Threads(value = 2)
@Warmup(iterations = 10)
@Fork(value = 2)
@Measurement(iterations = 10)
public String benchmarkC() {
...
}
每种方法都对具有相同目的的不同算法进行基准测试。当我一起运行所有基准测试时,与逐一运行基准测试相比,结果会有所不同。
例如,在 Java 文件上仅使用 onw 基准测试执行 JMH 运行。
@Benchmark
@Threads(value = 2)
@Warmup(iterations = 10)
@Fork(value = 2)
@Measurement(iterations = 10)
public String benchmarkA() {
...
}
如果仅运行此方法,则此方法的结果会更好,但在基准测试更多的情况下,结果会更差。
假设结果明智的基准测试 A > 基准测试 B > 基准测试 C 通过单独运行它们,如果我一次性运行它们,它们之间的差异就会被放大。
我还尝试更改基准的顺序(按字典顺序执行),结果是相同的。就好像基准测试的数量会影响结果。
可能是什么原因?
最佳答案
每个基准测试都在自己的 JVM 中执行(除非明确设置为其他行为),因此不应发生交叉基准污染。可能发生的情况是 CPU 的热节流,这也是很常见的情况。如果您在无法控制 CPU 频率的环境中进行基准测试,典型的行为是第一个基准测试提高 CPU 频率,而随后的基准测试则受到限制。您可以在 Linux 环境中通过切换到用户控制的电源调节器并为 CPU 设置固定频率来控制此变量。
关于java - JMH 多个基准 单独运行的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65065212/