You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 19:09:31