Java Microbenchmark Harness (JMH)

49 阅读3分钟

image.png

Java Microbenchmark Harness (JMH)

JMH

在衡量Java代码性能时,有许多因素需要考虑。例如,JIT编译,垃圾收集器行为和线程调度都可能会影响性能。在这种情况下,很重要的是要能够准确地测量Java代码的性能,并且可以消除这些因素的影响。这就是Java Microbenchmark Harness (JMH)的作用。

JMH是OpenJDK项目的一部分,它最初是由Oracle Labs开发的。它于2012年发布,并且在许多Java开发人员中变得非常受欢迎。它目前是Java社区中最常用的Java基准测试库之一。

特性

JMH被设计用于解决Java性能基准测试中的许多挑战,以下是一些JMH的特性:

  • 可以准确测量Java代码的性能。
  • 可以消除JIT编译,垃圾收集器行为和线程调度等因素的影响。
  • 可以测试不同代码片段之间的性能差异。
  • 可以测试不同JVM参数的影响。
  • 提供了几种不同的测试模式,包括基于时间和基于迭代的测试模式。

使用例子

下面是一个简单的例子,展示了如何使用JMH进行Java基准测试。

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@Fork(1)
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
public class MyBenchmark {
    @Benchmark
    public void testMethod() {
        // Your code here
    }
}

在这个例子中, @BenchmarkMode@OutputTimeUnit@Fork@Warmup@Measurement 是JMH注解的示例。这些注解用于配置基准测试。

  • @BenchmarkMode :设置JMH运行基准测试所使用的模式(平均时间,总时间,吞吐量等)。
  • @OutputTimeUnit :设置JMH基准测试结果输出的时间单位(毫秒,秒等)。
  • @Fork :设置执行基准测试的进程数。
  • @Warmup :设置运行基准测试前进行多少个预热迭代 和预热时间,以及迭代时间单位。
  • @Measurement :设置运行基准测试前进行的多少个测量迭代和测量时间,以及迭代时间单位。 这个例子只有一个测试方法,testMethod。您可以将更多的测试方法添加到您的基准测试中,并按照自己的需求配置每个测试方法。运行基准测试的主类可以看看如下:
public static void main(String\[] args) throws Exception {
    Options opt = new OptionsBuilder()
    .include(MyBenchmark.class.getSimpleName())
    .build();
    new Runner(opt).run();
}

关键参数作用

以下是一些重要的JMH参数以及它们的作用:

  • mode :设置运行基准测试的模式。
  • timeUnit :设置测试结果输出的时间单位。
  • warmupIterations :设置运行基准测试前进行多少个预热迭代。
  • warmupTime :设置运行基准测试前每个预热迭代要持续多长时间。
  • measurementIterations :设置运行基准测试期间要进行多少个测量迭代。
  • measurementTime :设置每个测量迭代要持续多长时间。
  • forks :设置执行基准测试的进程数。

测试报告中的各项指标含义

JMH生成的测试报告提供了许多指标,以下是一些重要的指标:

  • Score :每个基准测试的平均时间或运行速度。
  • Error :每个基准测试的标准差。
  • Unit :每个基准测试的时间单位。
  • Iterations :执行基准测试迭代的次数。
  • Warmup Iterations :执行基准测试预热迭代的次数。
  • Threads :每个基准测试所使用的线程数。 总之,JMH可以帮助Java开发人员准确地测量Java代码的性能,并消除许多因素的影响。针对不同的测试需求,可以使用不同的测试模式和参数来配置基准测试。

DevX 会持续分享有趣的技术和见闻,如果你觉得本文对你有帮助希望你可以分享给更多的朋友看到。该文章会同步在微信公众号 【DevXJava】, 方便在微信客户端阅读。

DevX 不止于技术