JMH基准测试的4种模式

JMH定义了4种基准测试模式,分别是吞吐量、平均时间、采样时间和单次调用时间。

先来看一下基准测试模式org.openjdk.jmh.annotations.Mode的定义:

public enum Mode {
  // 吞吐量
  Throughput("thrpt", "Throughput, ops/time"),
  // 平均时间
  AverageTime("avgt", "Average time, time/op"),
  // 采样时间
  SampleTime("sample", "Sampling time"),
  // 单次调用时间
  SingleShotTime("ss", "Single shot invocation time"),
  // 所有测试模式
  All("all", "All benchmark modes"),
  ;
}

可以看到,除了刚刚介绍的4种模式,还有一个是All模式,表示包含所有基准测试模式。

如果使用All模式,可以一次性进行4种基准模式的测试。

吞吐量(Throughput)

吞吐量(Throughput)模式,简称thrpt,单位为ops/time。

吞吐量模式,测量的是单位时间执行操作的次数。

通过连续调用Benchmark方法,计算出所有工作线程的吞吐量总和。该模式是基于时间的测试,将会持续运行直到到达迭代截止时间。

平均时间(AverageTime)

平均时间(AverageTime)模式,简称avgt,单位为time/op。

平均时间模式,测量的是执行每个操作的平均时间。

通过连续调用Benchmark方法,计算出所有工作线程上的平均调用时间。该模式是基于时间的测试,将会持续运行直到到达迭代截止时间。

该模式和吞吐量模式是相对的,但是使用不同的聚合策略。

采样时间(SampleTime)

采样时间(SampleTime)模式,简称sample,单位为time/op。

采样时间模式,测量的是每个操作的时间。

通过连续调用Benchmark方法,并随机采样调用所需的时间。该模式是基于时间的测试,将会持续运行直到到达迭代截止时间。

该模式会自动调整采样的频率,由于丢失采样可能会忽略一些暂停时间。

单次调用时间(SingleShotTime)

单次调用时间(SingleShotTime)模式,简称ss,单位为time/op。

单次调用时间模式,测量的是单次执行操作的时间。

通过调用一次Benchmark方法,测量其运行时间。

前面的几种测试模式,都会先进行热身,然后再进行测试。这样,可以防止受启动和运行波动的影响。

而单次调用时间模式则不同,测试时并不会进行热身。该模式,对于想在启动期间、运行不稳定的情况下测量操作时间,或者测量每一次操作时间时很有用。

还有一点需要注意的是,基准测试的计时器开销,可能比基准测试方法本身的开销还要大。也就是说,基准测试方法本身可能很简单,操作耗时很小。对于这种情况,可以考虑切换到采样时间(SampleTime)模式进行测试。

参考

https://github.com/openjdk/jmh


---转载本站文章请注明作者和出处 996极客教程(996geek.com),请勿用于任何商业用途---

留下评论