JMH如何使用
文章目录
JMH的基本用法
基础注解 @Benchmark
在一个基本测试类中至少
包含一个被@Benchmark
标记的方法,否则会抛出异常。
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
public class JMHExample02 {
public void normalMethod() {
}
public static void main(String[] args) throws RunnerException {
final Options opts = new OptionsBuilder().include(JMHExample02.class.getSimpleName())
.forks(1)
.measurementIterations(10)
.warmupIterations(10)
.build();
new Runner(opts).run();
}
}
异常:Exception in thread "main" No benchmarks to run; check the include/exclude regexps.
Warmup以及Measurement
Warmup: “热身”,使得在度量之前,类经历了早期的优化、JVM运行期编译、JIT优化
Measurement: 真正的度量操作,度量过程中的所有数据都会被纳入统计
全局设置
-
构造Options时设置批次执行
final Options opts = new OptionsBuilder().include(JMHExample02.class.getSimpleName()) .forks(1) //度量执行批次为5 .measurementIterations(5) //在度量之前先执行两次热身 .warmupIterations(2) .build(); new Runner(opts).run();
-
@Warmup与@Measurement注解
@BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MICROSECONDS) @State(Scope.Thread) @Measurement(iterations = 5) @Warmup(iterations = 2) public class JMHExample02
局部设置(基准测试方法之上)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
@Measurement(iterations = 5)
@Warmup(iterations = 3)
public class JMHExample03 {
@Benchmark
public void test1() throws InterruptedException {
TimeUnit.MILLISECONDS.sleep(10);
}
@Benchmark
@Warmup(iterations = 5)
@Measurement(iterations = 4)
public void test2() throws InterruptedException {
TimeUnit.MILLISECONDS.sleep(1);
}
public static void main(String[] args) throws RunnerException {
final Options opts = new OptionsBuilder().include(JMHExample03.class.