Java 基准测试框架(JMH)

在对不同工具做性能对比测试时,由于jvm的运行期优化可能导致结果的偏差。 所以,为了在大程度上避免这种偏差问题,则会用到OpenJDK的性能基准测试项目 JMH

项目构建

可以通过maven命令构建项目

mvn archetype:generate \
  -DinteractiveMode=false \
  -DarchetypeGroupId=org.openjdk.jmh \
  -DarchetypeArtifactId=jmh-java-benchmark-archetype \
  -DgroupId=<you_groupId> \
  -DartifactId=<you_artifactId> \
  -Dversion=1.0-SNAPSHOT 

或者在已有项目中引入依赖包

<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-core</artifactId>
    <version>${jmh.version}</version>
</dependency>
<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-generator-annprocess</artifactId>
    <version>${jmh.version}</version>
    <scope>provided</scope>
</dependency>

基本使用

注解

参数 作用 范围
@State 配置每个实例的生命周期
@BenchmarkMode 测试的维度,有吞吐量、平时时间、随机取样、单次运行 方法、类
@OutputTimeUnit 输出结果的时间单位 方法、类
@Warmup 预热迭代,以保证即时编译的工作 方法、类
@Measurement 设置执行测试迭代的参数 方法、类
@Fork 使用额外虚拟机测试数量 方法、类
@Setup 测试前置执行逻辑 方法
@TearDown 测试结束执行逻辑 方法
@Benchmark 标记该方法需要进行测试,并生成class类 方法
@Param 指定参数的测试范围 属性
@CompilerControl 设置即时编译的效果 构造器、类、方法

启动

编写 main 方法编译启动或打包成 jar 包运行

public static void main(String[] args) throws RunnerException {
	Options opt = new OptionsBuilder()
	    .include(MyBenchmark.class.getSimpleName())
		.jvmArgs("-server", "-Xms2048m", "-Xmx2048m")
		.addProfiler(GCProfiler.class)
		.addProfiler(StackProfiler.class)
		.build();

	new Runner(opt).run();
}

https://blog.csdn.net/lxbjkben/article/details/79410740