JMH--一款由OpenJDK开发的基准测试工具 - 飞外
发布时间: 2023-07-06
什么是JMH

JMH 是 OpenJDK 团队开发的一款基准测试工具,一般用于代码的性能调优,精度甚至可以达到纳秒级别,适用于 java 以及其他基于 JVM 的语言。和 Apache JMeter 不同,JMH 测试的对象可以是任一方法,颗粒度更小,而不仅限于rest api。

使用时,我们只需要通过配置告诉 JMH 测试哪些方法以及如何测试,JMH 就可以为我们自动生成基准测试的代码。

JMH生成基准测试代码的原理

我们只需要通过配置(主要是注解)告诉 JMH 测试哪些方法以及如何测试,JMH 就可以为我们自动生成基准测试的代码。

那么 JMH 是如何做到的呢?

要使用 JMH,我们的 JMH 配置项目必须是 maven 项目。在一个 JMH配置项目中,我们可以在pom.xml看到以下配置。JMH 自动生成基准测试代码的本质就是使用 maven 插件的方式,在 package 阶段对配置项目进行解析和包装。

<plugin>                <groupId>org.apache.maven.plugins</groupId>                <artifactId>maven-shade-plugin</artifactId>                <version>2.2</version>                <executions>                    <execution>                        <phase>package</phase>                        <goals>                            <goal>shade</goal>                        </goals>                        <configuration>                            <finalName>$${uberjar.name}</finalName>                            <transformers>                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">                                    <mainClass>org.openjdk.jmh.Main</mainClass>                                </transformer>                            </transformers>                            <filters>                                <filter>                                    <artifact>*:*</artifact>                                    <excludes>                                        <exclude>META-INF/*.SF</exclude>                                        <exclude>META-INF/*.DSA</exclude>                                        <exclude>META-INF/*.RSA</exclude>                                    </excludes>                                </filter>                            </filters>                        </configuration>                    </execution>                </executions>            </plugin>
从入门例子开始

下面会先介绍整个使用流程,再通过一个入门例子来演示如何使用 JMH。

步骤

如果我有一个 A 项目,我希望对这个项目里的某些方法进行 JMH 测试,可以这么做:

  1. 创建单独的 JMH 配置项目B。

新建一个独立的配置项目 B(建议使用 archetype 生成,可以确保配置正确),B 依赖了 A。

当然,我们也可以直接将项目 A 作为 JMH 配置项目,但这样做会导致 JMH 渗透到 A 项目中,所以,最好不要这么做。

  1. 配置项目B。

在 B 项目里面,我们可以使用 JMH 的注解或对象来指定测试哪些方法以及如何测试,等等。

  1. 构建和运行。

在正确配置 pom.xml 的前提下,使用 mvn 命令打包 B 项目,JMH 会为我们自动生成基准测试代码,并单独打包成 benchmarks.jar。运行 benchmarks.jar,基准测试就可以跑起来了。

注意,JMH 也支持使用 Java API 的方式来运行,但官方并不推荐,所以,本文也不会介绍。

下面开始入门例子。

项目环境说明

maven:3.6.3

操作系统:win10

JDK:8u231

JMH:1.25

创建 JMH 配置项目

为了保证配置的正确性,建议使用 archetype 生成 JMH 配置项目。cmd 运行下面这段代码:

mvn archetype:generate ^-DinteractiveMode=false ^-DarchetypeGroupId=org.openjdk.jmh ^-DarchetypeArtifactId=jmh-java-benchmark-archetype ^-DarchetypeVersion=1.25 ^-DgroupId=cn.zzs.jmh ^-DartifactId=jmh-test01 ^-Dversion=1.0.0

注:如果使用 linux,请将“^”替代为“\”。

命令执行后,在当前目录下生成了一个 maven 项目,如下。这个项目就是本文说到的 JMH 配置项目。这里 archetype 还提供了一个例子MyBenchmark

└─jmh-test01    │  pom.xml    │    └─src        └─main            └─java                └─cn                    └─zzs                        └─jmh                                MyBenchmark.java
配置 JMH 配置项目配置 pom.xml

因为是使用 archetype 生成的项目,所以pom.xml 文件已经包含了比较完整的 JMH 配置,如下(省略部分)。如果自己手动创建配置项目,则需要拷贝下面这些内容。

<dependencies>        <dependency>            <groupId>org.openjdk.jmh</groupId>            <artifactId>jmh-core</artifactId>            <version>$${jmh.version}</version>        </depe

微信