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();
}