- @Benchmark 注解基准测试方法,注解的目标为方法。为了保证测试的可靠性,有如下限制
- 方法必须为公共方法
- 方法参数可能只包括State类,或者,JMH的基础类型
- 方法仅在相关State位于 封闭类(enclosing class) 内才可以同步
- @BenchmarkMode 基础测试模式,声明基准测试将运行的模式,注解的目标可为方法和类。注解在方法上时,只影响被注解方法;
注解在类上时,影响所有该类内的方法。这个注解的内容有可能被运行时配置覆盖。基础测试模式有
- Throughput(吞吐量),单位时间内的操作数。
- AverageTime(平均时间),每个操作的平均时间。
- SampleTime(采样时间),采样每一个操作的时间。该模式持续调用基准测试方法,随机采样方法调用所需要的时间,自动调整采样频率。
- SingleShotTime(单个操作的测量时间),用于测量一次基准测试的调用时间。对于不想持续调用的场景,例如对于冷启动测试或者批处理测试很有用。
这个模式只会调用一次基准测试方法。 - All,覆盖以上所有测试模式。
- @OutputTimeUnit 提供测试报告结果中显示的默认时间单位。接受java.util.concurrent.TimeUnit枚举值。
- @State 标识状态对象,表示被标识类可作为基准测试方法的参数,封装了基准测试正在运行的状态,且可以被继承。
接受的Scope范围类型有
- Benchmark,同一类型的所有实例可以被所有工作线程共享。 而被 @Setup 和 @TearDown标识的方法只能被一个工作线程执行,
且只在对应层次执行一次。其他线程将不会再影响到状态对象。 - Group,同一类型的所有实例可以被在同一group内的所有工作线程共享。而每一个线程组将会提供他们自己的状态对象。 但是,被 @Setup 和 @TearDown标识的方法只能被一个工作线程执行,
且只在对应层次执行一次。其他线程将不会再影响到状态对象。 - Thread,同一类型的所有实例都是不同的,即便是多个状态对象被注入到同一个基准测试中。
- @Setup,标识fixture方法是在 基准测试前运行。fixture方法指的是与基准测试相关的资源操作,如初始化或清理。接收的参数Level有
- Trial,在每个基准测试前或者后执行。Trial指的是基准测试的遍历(iterations)集合。
- Iteration,在每个基准测试循环前或后执行。Iteration指的是基准测试的调用(invocations)集合。
- Invocation,在每个基准测试被执行时执行。
- @TearDown ,标识fixture方法是在 基准测试后运行。因为执行相互独立,可能与执行@Setup的线程不同。
- @Fork,设置基准测试的默认启动的JVM进程数。注解在方法上时,只影响被注解方法;
注解在类上时,影响所有该类内的方法。这个注解的内容有可能被运行时配置覆盖。可以自定义jvm运行参数。 - @Group,执行组,主要用于进行不对称测试。每个执行组包含一个或多个线程。
在一个特定执行组内,一个线程执行一个被@Group和@Benchmark标识的基准测试方法。
默认一个线程执行一个基准测试方法,可以通过@GroupThreads注解覆盖默认值。JMH会根据执行组的数量以及工作组线程数来获取工作线程的请求数。 - @GroupThreads,定义在该工作组内运行特定基准测试方法的线程数。
- @Warmup,配置基准测试的预热参数,注解的目标可为方法和类。注解在方法上时,只影响被注解方法;
注解在类上时,影响所有该类内的方法。这个注解的内容有可能被运行时配置覆盖。可以配置
- iterations ,遍历次数
- time ,每次预热遍历的时间
- timeUnit ,预热遍历时间的单位
- batchSize ,每次操作基准测试方法调用的数量
- @Measurement,配置基准测试的默认测量参数,注解的目标可为方法和类。注解在方法上时,只影响被注解方法;
注解在类上时,影响所有该类内的方法。这个注解的内容有可能被运行时配置覆盖。可以配置
- iterations ,遍历次数
- time ,每次预热遍历的时间
- timeUnit ,预热遍历时间的单位
- batchSize ,每次操作基准测试方法调用的数量
- @AuxCounters,用于标识@State对象作为次要基准测试性能指标的辅助计数器。该注解为实验性api,可能将来会改变或者移除。
- 该辅助计数器仅支持 Mode.AverageTime 和 Mode.Throughput模式。
- 该辅助计数器仅用于 Scope.Thread的有效范围,即是线程间相互隔离,每个线程都有自己副本。
- 只有公共变量和方法会被识别为指标。
- 只有数值变量和返回值为数值的方法会被识别为指标。包含原始数据类型和封装后的类型。
- 返回值为空的方法,不会校验类型,即@AuxCounters内可包含@Setup和@TearDown方法。
- @Param,标识基准测试中可配置的参数。需要注意
- 标识的变量不能为final,并且应该只位于 @State对象内。
- 标识的变量类型,只能位原始数据类型,原始数据类型的包装类,字符串,或者枚举值。
- 需要设置默认值。
- @OperationsPerInvocation,用于在基准测试方法中有循环执行操作的逻辑时测量单次操作的性能。例如,
@Benchmark
@OperationsPerInvocation(10) // 每次调用基准测试方法,循环方法内有10次循环操作
public void test() {
for (int i = 0; i < 10; i++) {
// 操作
}
}