jmh多个基准测试在独立运行上的不同结果

e0bqpujr  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(960)

我通过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通过单独运行它们,如果我一次性运行它们,它们之间的差异就会放大。
我还尝试改变基准测试的顺序(按字典顺序执行),结果是一样的。就好像基准的数量影响结果一样。
原因是什么?

rryofs0p

rryofs0p1#

每个基准都在自己的jvm中执行(除非显式设置为其他方式),所以不应该发生跨基准污染。可能发生的,而且很常见的,是cpu的热节流。如果您在一个无法控制cpu频率的环境中进行基准测试,典型的行为是第一个基准测试将cpu频率推高,而随后的基准测试将被限制。在linux环境中,您可以通过切换到用户控制的电源调节器并为cpu设置固定频率来控制此变量。

相关问题