You need to enable JavaScript to run this app. 基于JMH的Java代码执行最大/最小/平均耗时统计基准测试模式选择
优惠活动
大模型
产品
解决方案
定价
更多

基于JMH的Java代码执行最大/最小/平均耗时统计基准测试模式选择

各JMH测试模式的实际能力边界

先把你之前对几个模式的认知偏差明确澄清:

  • Mode.Throughput:默认仅输出固定迭代周期内的每秒调用次数,执行流程中从设计上就不逐次记录单次调用的耗时,没有任何途径提取单次执行的极值数据,完全不符合你的需求。
  • Mode.AverageTime:和Throughput的统计逻辑同源,只是把指标换算成了“每次调用的平均耗时”。它的执行过程仅累计两个全局值:所有调用的总耗时、总调用次数,根本不会存储任意一次调用的单独耗时,就算想额外提取最小/最大值也没有数据来源,仅能输出平均耗时一个指标。
  • Mode.SingleShotTime:每个迭代周期仅执行1次基准方法,逐次记录每次执行的耗时。这种模式确实可以聚合出多次执行的最小、最大、平均耗时,但存在明显短板:如果你的被测代码是微秒级执行速度的短方法,每次迭代的JVM调度、计时埋点的固定开销会远大于方法本身的执行耗时,最终统计的结果会严重失真,仅适合测试毫秒级以上、单次执行开销较大的代码块。
  • Mode.SampleTime:很多人对这个模式的“仅统计部分调用”的设计有误解,以为是JMH偷懒故意少统计,实际上是为了避免测试本身的开销干扰结果。如果被测方法执行速度极快(比如纳秒级),对每一次调用都做System.nanoTime()计时埋点的开销,可能会超过方法本身的执行耗时,相当于测出来的全是计时逻辑本身的速度,结果完全没有参考价值。因此这个模式会在固定时长的迭代内持续循环调用被测方法,按合理的频率随机抽取部分调用做计时记录,平衡统计精度和测试开销。
匹配你需求的最优JMH选型

Mode.SampleTime就是JMH内置的、能同时输出平均耗时、最小耗时、最大耗时三个核心指标的模式,完全覆盖你的基础需求:

  • 它的默认测试输出除了三个核心指标外,还会自动附带不同分位数的耗时统计(比如90%、99%的执行耗时低于某个阈值),不需要你额外写自定义统计逻辑。
  • 如果你对采样的精度有要求,可以通过配置采样间隔,调整采样的密度,尽可能减少采样偏差。
JMH的全部内置测试模式

JMH没有其他隐藏的内置测试模式,总共仅提供5种可选模式:

  • 你之前提到的4种:Throughput、AverageTime、SingleShotTime、SampleTime
  • 最后一种为Mode.All:会依次把前面4种模式的测试流程全部执行一遍,每个模式独立输出对应维度的统计结果,适合需要全维度评估代码性能的场景。
自定义高精度统计的扩展方案

如果SampleTime的采样逻辑无法满足你的逐次统计需求,不需要更换其他测试框架,可以通过实现JMH内置的Profiler扩展接口,在执行流中逐次拦截每一次基准方法的执行耗时,自行维护最小耗时、最大耗时、累计总耗时的计数变量,在测试结束后自行计算平均耗时即可,整个流程完全不需要脱离JMH的生态。


内容的提问来源于stack exchange,提问作者NiccoMlt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 20:45:04