JMH(Java Microbenchmark Harness)如何获取Benchmark运行耗时
结论
完全可行,不用改你写的基准测试方法,靠JMH原生API就能直接拿到对应300微秒的int/long类型数值。别自己在测试方法里手写前后计时逻辑,不仅会破坏JMH的基准测试准确性,拿到的结果和JMH统计出的300微秒标准值偏差也会很大。
实现方法
你给foo()方法加了@OutputTimeUnit(TimeUnit.MICROSECONDS)注解,JMH输出的300微秒是经过预热、多轮迭代采样、剔除异常值之后算出来的稳定统计结果,直接通过Runner运行测试的返回结果就能提取数值,示例代码如下:
public static void main(String[] args) throws Exception { // 配置基准测试参数,和你注解上的配置保持一致 Options options = new OptionsBuilder() .include(你的基准测试类全类名 + ".foo") .timeUnit(TimeUnit.MICROSECONDS) // 可按需调整预热、测量轮次,保证结果稳定在300左右 .warmupIterations(3) .measurementIterations(5) .build(); // 执行测试,拿到全部结果 Collection<RunResult> runResults = new Runner(options).run(); for (RunResult runResult : runResults) { // 提取主指标得分,单位就是你设置的微秒 double rawScore = runResult.getPrimaryResult().getScore(); // 四舍五入转成long类型,结果稳定时拿到的就是300 long costMicrosLong = Math.round(rawScore); // 300在int取值范围内,可以安全强转 int costMicrosInt = (int) costMicrosLong; // 后续直接使用这两个整型变量就行 } }
避坑提醒
- 不要在
foo()方法内部靠System.nanoTime()打前后时间戳算耗时:JMH运行时会做JIT编译优化、死代码消除,你手动加的计时代码会干扰正常优化流程,而且单次调用的耗时波动极大,和JMH输出的稳定统计值没有参考意义。 - 如果拿到的原始score带小数、和300有微小偏差是正常采样误差,适当增加测量轮次、保证测试环境没有其他高负载进程干扰,结果会非常接近300,四舍五入就能得到整数300。
内容的提问来源于stack exchange,提问作者coderodde
相关产品推荐
相关产品推荐

