我通过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() {
...
}
如果只运行此方法,则此方法的结果会更好,但是如果使用更多基准,则结果会更差。
假设结果方面的benchmarka>benchmarkb>benchmarkc通过单独运行它们,如果我一次性运行它们,它们之间的差异就会放大。
我还尝试改变基准测试的顺序(按字典顺序执行),结果是一样的。就好像基准的数量影响结果一样。
原因是什么?
1条答案
按热度按时间rryofs0p1#
每个基准都在自己的jvm中执行(除非显式设置为其他方式),所以不应该发生跨基准污染。可能发生的,而且很常见的,是cpu的热节流。如果您在一个无法控制cpu频率的环境中进行基准测试,典型的行为是第一个基准测试将cpu频率推高,而随后的基准测试将被限制。在linux环境中,您可以通过切换到用户控制的电源调节器并为cpu设置固定频率来控制此变量。