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

The*_*ing 5 java benchmarking jmh

在 JMH(Java Microbenchmark Harness)中,我们可以使用

@BenchmarkMode(Mode.AverageTime)
@Warmup(iterations = 10)
@Measurement(iterations = 10)
Run Code Online (Sandbox Code Playgroud)

评估 JVM 预热后执行的平均时间。

我们也可以使用

@BenchmarkMode(Mode.SingleShotTime)
@Measurement(iterations = 1)
Run Code Online (Sandbox Code Playgroud)

估计执行的冷启动时间。但这只会执行一次基准测试,这可能会引入偏差。那么有没有什么方法可以评估JMH中冷启动的平均时间呢?

Eug*_*ene 3

Alexey 本人介绍(虽然是 2014 年):

\n
\n

单次基准测试最初是为了在多个分叉上运行单次测量迭代——评估“冷”性能的场景。但在许多情况下,您可能需要更多的测量\迭代,特别是如果您仅运行单个分支,\n因为会生成更多样本。

\n
\n
@BenchmarkMode(Mode.AverageTime)\n@OutputTimeUnit(TimeUnit.NANOSECONDS)\npublic class AverageSingleShot {\n\n    public static void main(String[] args) throws Exception {\n        Options opt = new OptionsBuilder()\n            .include(AverageSingleShot.class.getSimpleName())\n            .build();\n\n        new Runner(opt).run();\n    }\n\n    @Fork(100)\n    @Benchmark\n    @BenchmarkMode(Mode.SingleShotTime)\n    public int test() {\n        return ThreadLocalRandom.current().nextInt() + ThreadLocalRandom.current().nextInt();\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

除此之外,这会告诉您平均值请参阅100):

\n
 Benchmark               Mode  Cnt      Score      Error  Units\n AverageSingleShot.test    ss  100  41173.540 \xc2\xb1 2871.546  ns/op\n \n
Run Code Online (Sandbox Code Playgroud)\n

您还将获得PercentilesHistogram

\n