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中冷启动的平均时间呢?
据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}\nRun Code Online (Sandbox Code Playgroud)\n除此之外,这会告诉您平均值(请参阅100):
Benchmark Mode Cnt Score Error Units\n AverageSingleShot.test ss 100 41173.540 \xc2\xb1 2871.546 ns/op\n \nRun Code Online (Sandbox Code Playgroud)\n您还将获得Percentiles和Histogram。