JMH(Java Microbenchmark Harness):Java微基准测试完全指南
JMH(Java Microbenchmark Harness)是专为Java语言设计的微基准测试(微性能测试)创建、执行与分析库。由JVM性能团队(包括Alexey Shipilev等专家)开发,JMH已成为Java生态系统中测量小块代码性能的事实标准。
1. 什么是JMH?为什么需要它?
为Java编写正确的性能测试并非易事。JIT编译器、垃圾回收器、CPU级优化(缓存、分支预测)甚至操作执行顺序都可能完全扭曲测试结果。在main方法中简单地使用for循环,往往会导致JIT编译器将测试代码视为"死代码"并优化掉(死代码消除),最终你测量的只是空循环的速度。
JMH自动解决了这些问题。它管理代码的"预热"(Warmup)过程,使JIT编译器稳定运行;防止"死代码"优化;管理JVM隔离的Fork操作;并提供具有统计意义的结果(平均值、百分位数、误差范围)。
开发者为什么需要JMH? 为了在选择算法、数据结构、序列化方式、优化关键代码段或比较不同实现(例如StringBuilder vs String.concat)时做出明智决策。没有JMH,你可能会"优化"那些根本不是瓶颈的代码,或者得到无法在生产环境中复现的结果。
2. 安装指南
JMH是一个Java库,因此不能通过pip或npm安装。最便捷的方式是使用Maven或Gradle。
方式一:Maven(推荐快速上手)
创建一个新的Maven项目,并在pom.xml中添加以下内容:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>jmh-example</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jmh</packaging>
<dependencies>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.37</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.37</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
方式二:Gradle
plugins {
id 'java'
id 'me.champeau.jmh' version '0.7.2'
}
dependencies {
implementation 'org.openjdk.jmh:jmh-core:1.37'
annotationProcessor 'org.openjdk.jmh:jmh-generator-annprocess:1.37'
}
jmh {
jmhVersion = '1.37'
}
方式三:下载JAR(不推荐)
你可以从GitHub下载fat-jar,但这种方式在依赖管理上不够方便。