JMH基准测试工具的基本使用

JMH是一款由OpenJDK团队开发的高性能基准测试工具,适用于Java及JVM语言的代码优化,精度可达纳秒级。本文介绍如何使用Gradle或Maven导入依赖、编写测试代码并运行JMH。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是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-corejmh-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文件

通过cmdPowerShell打开对应路径或者直接打开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设置文件输出路径

最终的结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值