Benchmark

JMH

jmh(Java Microbenchmark Harness) 是 Java 微基准测试框架,可以用于比较 Java 程序的性能好坏

万物皆可 hello world:

package org.openjdk.jmh.samples;

import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

public class JMHSample_01_HelloWorld {
@Benchmark
public void wellHelloThere() {

}

public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(JMHSample_01_HelloWorld.class.getSimpleName())
.forks(1)
.build();
new Runner(opt).run();
}
}

设置 @Warmpup(iterations = 1, time = 1, timeUnit = TimeUnit.SECONDS)@Mesurement 为迭代次数和每次运行时间

@BenchmarkMode(Mode.xxx) 设置输出的类型

  • Throughput 吞吐量模式,即没单位时间方法执行多少次
  • AverageTime 平均耗时测试
  • SampleTime 抽样测试,会采样输出最快的,99% 快的等
  • SingleShotTime 冷启动模式,此方法在一轮中只会执行一次,用于测试冷启动性能
  • All 以上四种模式都测

@OutputTimeUnit 设置输出的时间单位

@State(Scope.xxx) 描述了作用域

  • Thread 不同线程下不同对象
  • Benchmark 整个测试只使用一个对象

可以写在整个测试类外面,作为默认 State

@Setup 在 benchmark 之前执行,@TearDown 在结束后执行

可以配置作用的 Level:

  • Trail 整个 benchmark
  • Iteration 每个迭代
  • Invocation 每个方法调用

@Fork(0) 表示在当前线程中执行,@Fork(n) 表示在 n 个新的 JVM 中运行

可以使用 JMH VisualizerJMH Visual Chart 可视化结果