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),请勿用于任何商业用途---