如何使用jmh测量平均冷启动时间?

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

在jmh(javamicrobenchmarkharness)中,我们可以使用

@BenchmarkMode(Mode.AverageTime)
@Warmup(iterations = 10)
@Measurement(iterations = 10)

评估jvm预热后执行的平均时间。
我们也可以使用

@BenchmarkMode(Mode.SingleShotTime)
@Measurement(iterations = 1)

估计执行的冷启动时间。但这只执行一次基准测试,这可能会引入偏差。那么,是否有任何方法来评估jmh冷启动的平均时间呢?

bfrts1fy

bfrts1fy1#

据阿列克谢自己说(尽管是从2014年开始):
单次基准测试最初注定要在多个分叉上运行一次测量迭代——这些场景用于估计“冷”性能。但是在许多情况下,您可能需要更多的度量迭代,特别是如果您只运行一个fork,因为会生成更多的样本。

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class AverageSingleShot {

    public static void main(String[] args) throws Exception {
        Options opt = new OptionsBuilder()
            .include(AverageSingleShot.class.getSimpleName())
            .build();

        new Runner(opt).run();
    }

    @Fork(100)
    @Benchmark
    @BenchmarkMode(Mode.SingleShotTime)
    public int test() {
        return ThreadLocalRandom.current().nextInt() + ThreadLocalRandom.current().nextInt();
    }

}

除此之外,这将告诉你平均值(见 100 ):

Benchmark               Mode  Cnt      Score      Error  Units
 AverageSingleShot.test    ss  100  41173.540 ± 2871.546  ns/op

你也会得到 Percentiles 和一个 Histogram .

相关问题