什么是JMH?
Java基准测试工具(Java Microbenchmarking Harness,JMH) 是 OpenJDK 团队开发的一款基准测试工具,一般用于代码的性能调优,精度甚至可以达到纳秒级别,适用于 java 以及其他基于 JVM 的语言。和 Apache JMeter 不同,JMH 测试的对象可以是任一方法,颗粒度更小,而不仅限于rest api。
JMH的使用
要使用JMH工具需要先导入相关依赖,可以通过gradle或者maven导入相关依赖后进行使用。
导入依赖
-
通过gradle导入依赖
//build.gradle apply plugin: 'me.champeau.jmh' buildscript { repositories { maven { url 'https://maven.aliyun.com/repository/gradle-plugin' /* 这里使用的是阿里云的镜像,可以通过https://developer.aliyun.com/mvn/search 查找所需要的jmh版本 */ } } dependencies { classpath 'me.champeau.jmh:jmh-gradle-plugin:0.6.8' } } sourceSets { jmh { java { srcDir projectDir //设置项目路径 } } } dependencies { jmh 'org.openjdk.jmh:jmh-core:1.35' } /* jmh相关配置 更多配置信息见:https://github.com/melix/jmh-gradle-plugin */ jmh { resultsFile = project.file("${project.buildDir}/results/jmh/results.txt") //设置输出路径 duplicateClassesStrategy = DuplicatesStrategy.WARN failOnError = true // See https://github.com/melix/jmh-gradle-plugin // for other options }
-
通过maven导入jmh-core和jmh-generator-annprocess依赖(注意jmh-generator-annprocess的scope设置,去maven仓库找的默认配置为test,需要设置为provided才会一起被打包进jar包当中)
<!-- https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-core --> <dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-core</artifactId> <version>1.35</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-generator-annprocess --> <dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-generator-annprocess</artifactId> <version>1.35</version> <scope>provided</scope> </dependency>
编写测试代码
@State(Scope.Thread) //设置状态 每个执行基准测试的线程都会独享一个对象示例
@BenchmarkMode(Mode.AverageTime) //设置基准测试模式
@OutputTimeUnit(TimeUnit.MICROSECONDS) //设置时间单位
@Warmup(iterations = 5) //设置预热时间 每个基准测试前执行5次预热执行
@Measurement(iterations = 5) //设计基准测试次数为5次
@Fork(1) //设置进程数为1
public class JMH1 {
private long[] la;
@Setup
public void setup() {
la = new long[250_000_000];
}
@Benchmark
public void setAll() {
Arrays.setAll(la, n -> n);
}
@Benchmark
public void parallelSetAll() {
Arrays.parallelSetAll(la, n -> n);
}
}
运行JMH
通过gradle运行JMH
gradle构建完成之后会在项目路径下生成gradlew
文件
通过cmd
、PowerShell
打开对应路径或者直接打开IDEA下的Terminal
。由于以上任务存在与我valitaing的子目录下,所以通过graldew
来可以防止触发其他gradlew命令的耗时基准测试。只是一次测试可以直接使用gradle jmh
来运行
通过maven运行JMH
- 第 1 步。设置基准测试项目。以下命令将生成新的 JMH 驱动 项目文件夹:
test
$ mvn archetype:generate \
-DinteractiveMode=false \
-DarchetypeGroupId=org.openjdk.jmh \
-DarchetypeArtifactId=jmh-java-benchmark-archetype \
-DgroupId=org.sample \
-DartifactId=test \
-Dversion=1.0
如果要对其他的 JVM 语言(比如Kotlin,Scala等)进行基准测试,可以使用现有工具中的其他工具,它相当于以替换上面给出的项目 中的另一种语言。使用其他工具可能需要对生成配置进行其他更改,请参阅生成的项目中的内容。
第 2 步。建立benchmarks。生成项目后,可以使用以下命令生成项目 Maven 命令:
$ cd test/
$ mvn clean verify
第 3 步。运行基准测试。构建完成后,您将获得包含JMH的可执行 JAR, 其中包含您的基准测试以及所有基本的 JMH 基础架构代码
$ java -jar target/benchmarks.jar
-
另一种是通过JMH插件运行测试代码。安装后可以通过
Alt+Inster
->Generate JMH Benchmark
快速生成Benchmark测试具体使用教程见idea-jmh-plugin
这里的Program arguments
可以在对应位置后添加相关配置
jmh.JMH.*
表示测试jmh.JMH类下所有的Benchmark
-o
设置文件输出路径
最终的结果如下: