Bootstrap

最快最细致的JMH微基准测试入门

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: 真正的度量操作,度量过程中的所有数据都会被纳入统计

全局设置
  1. 构造Options时设置批次执行

    final Options opts = new OptionsBuilder().include(JMHExample02.class.getSimpleName())
                    .forks(1)
       				//度量执行批次为5
                    .measurementIterations(5)
        			//在度量之前先执行两次热身
                    .warmupIterations(2)
                    .build();
            new Runner(opts).run();
    
  2. @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.
;