JMH Java微基准测试完全指南:方法与实战案例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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,但这种方式在依赖管理上不够方便。

3. 快速上手——最小化工作示例

推荐