介绍一下 java 性能测试框架 JMH
Java Microbenchmark Harness (JMH) 是一种专门用于进行 Java 代码性能测试的框架。
它是由 OpenJDK 社区开发并维护的,旨在提供准确、一致和可靠的性能测试结果。
JMH 可以帮助开发人员在微秒级别对代码的性能进行精细的测量和分析。
以下是 JMH 的一些主要特点和优势:
-
自动优化:JMH 会自动解决许多可能影响测试结果的因素,例如 JVM 的热身效应、即时编译(JIT)优化等。这确保了测试的准确性和可重复性。
-
严格控制:JMH 提供了多种参数配置和统计选项,使得用户可以精确地控制测试的细节,从而获得更加全面的性能分析。
-
防止优化:JMH 会通过“黑洞”和“白洞”技术,防止 JVM 在测试中进行过度优化或移除没有实际作用的代码。
-
轻量级:JMH 是一个相对轻量级的库,不会对被测代码产生过多干扰,从而确保测量结果较为准确。
-
易于使用:虽然性能测试本身是复杂的任务,但是 JMH 提供了一组简洁且易于使用的注解和API,使得开发人员可以轻松地编写性能测试代码。
JMH 测试的基本步骤如下:
-
编写被测的 Java 方法或代码段。
-
使用 JMH 提供的注解(如
@Benchmark
)来标记需要进行性能测试的方法。 -
配置测试参数,例如执行次数、线程数等。
-
运行 JMH 测试,它会自动运行多次测试,并生成详细的性能报告。
JMH 的安装和使用需要一定的 Java 和性能测试的知识,但它是一个非常强大和可靠的工具,可以帮助开发人员进行高质量的性能分析和优化。
由于 JMH 是由 OpenJDK 社区维护,因此它与 Java 生态系统紧密集成,并且经过了广泛的测试和验证。
给一个入门例子
当使用 JMH 进行性能测试时,一个常见的入门例子是比较两个字符串连接的方式的性能:使用字符串连接操作符(+)和使用 StringBuilder。我们将测试这两种方法的执行时间以比较它们的性能差异。
首先,确保已经正确安装了 JDK 和 Maven。然后,按照以下步骤来编写和运行 JMH 测试。
步骤1:创建 Maven 项目
首先,创建一个 Maven 项目并在 pom.xml
文件中添加以下依赖:
<dependencies>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.33</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.33</version>
<scope>provided</scope>
</dependency>
</dependencies>
步骤2:编写性能测试代码
创建一个 Java 类,例如 StringConcatenationBenchmark
,并编写以下性能测试代码:
import org.openjdk.jmh.annotations.*;
import java.util.concurrent.TimeUnit;
@State(Scope.Thread)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class StringConcatenationBenchmark {
private String str1 = "Hello";
private String str2 = "World";
@Benchmark
public String testStringConcatenation() {
return str1 + " " + str2;
}
@Benchmark
public String testStringBuilder() {
StringBuilder sb = new StringBuilder();
sb.append(str1);
sb.append(" ");
sb.append(str2);
return sb.toString();
}
public static void main(String[] args) throws Exception {
org.openjdk.jmh.Main.main(args);
}
}
在这个例子中,我们使用了 JMH 提供的注解来标记两个被测方法 testStringConcatenation()
和 testStringBuilder()
。
@Benchmark
注解表示这些方法是要进行性能测试的方法。@BenchmarkMode
注解定义了测试模式(平均时间)。@OutputTimeUnit
注解指定了测试结果的时间单位。
步骤3:运行性能测试
在命令行中,进入到项目根目录,并运行以下命令:
mvn clean install
java -jar target/benchmarks.jar
JMH 将运行多次测试,并在控制台输出性能测试结果,包括每个测试方法的平均执行时间等信息。
请注意,由于性能测试的结果可能受到多种因素的影响,因此最好在稳定的环境中运行测试,并运行多次测试以获得更准确的结果。
idea 编辑器对应的 jmh 插件
对于 IntelliJ IDEA 编辑器,有一个名为 “JMH Plugin” 的插件,它提供了对 Java Microbenchmark Harness (JMH) 框架的支持。该插件使得在 IDEA 中编写和运行 JMH 测试变得更加方便。
以下是安装和使用 JMH Plugin 的步骤:
步骤1:打开 IntelliJ IDEA
确保已经打开了你的 IntelliJ IDEA 编辑器。
步骤2:打开插件设置
点击顶部菜单栏的 “File”(文件),然后选择 “Settings”(设置)。
步骤3:选择插件
在 “Settings” 窗口中,选择 “Plugins”(插件)选项,然后点击 “Marketplace”(插件商店)选项卡。
步骤4:搜索插件
在 “Marketplace” 搜索框中输入 “JMH” 并点击搜索按钮。
步骤5:安装插件
在搜索结果中找到 “JMH Plugin”,然后点击右侧的 “Install”(安装)按钮,跟随提示完成插件安装。
步骤6:重启 IDEA
安装完成后,IntelliJ IDEA 会提示你重启编辑器以激活新安装的插件。请点击 “Restart IDE”(重启编辑器)来重启 IDEA。
步骤7:创建 JMH 测试类
在 IDEA 中创建一个新的 Java 类,然后在类中编写 JMH 测试方法,并使用 JMH 注解标记这些方法。
步骤8:运行 JMH 测试
在编辑器的测试类中右键点击,选择 “Run ‘All Benchmarks’“,或者点击测试方法的左侧小绿箭头运行单个测试方法。
IDEA 会使用 JMH 插件来运行你的 JMH 测试,并在运行完成后提供详细的性能测试结果和报告。
通过安装 JMH Plugin,你可以在 IntelliJ IDEA 中轻松编写、运行和分析 JMH 性能测试,帮助你更好地优化和评估你的 Java 代码性能。
参考资料
chat
https://plugins.jetbrains.com/plugin/7529-jmh-java-microbenchmark-harness
https://github.com/openjdk/jmh/tree/master