关闭

OpenJDK JMH——Java程序的基准测试工具

发表于:2023-10-23 09:49

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:架构师笔记    来源:今日头条

#
JMH
  背景
  JMHJava Microbenchmark Harness)是一个专门用于编写、运行和分析Java微基准测试的工具。它是由OpenJDK项目提供的一个开源项目,旨在帮助开发人员准确地测量和评估Java代码的性能。
  JMH提供了一组注解和API,使得编写微基准测试变得简单和方便。使用JMH,您可以定义和运行各种类型的基准测试,包括方法级别的基准测试、类级别的基准测试和多线程基准测试。JMH还提供了丰富的选项和配置,以控制基准测试的执行方式,如迭代次数、线程数、预热时间等。
  JMH的主要特点包括:
  ·自动优化:JMH会自动优化基准测试,以消除热点代码的影响,并提供准确的性能度量。
  · 避免优化:JMH使用黑魔法技巧来避免JIT编译器过早优化基准测试代码。
  · 统计数据:JMH提供了丰富的统计数据和报告,包括平均执行时间、吞吐量、标准差等,以帮助您分析和理解基准测试的性能。
  · 基准测试模式:JMH支持多种基准测试模式,如平均时间模式、吞吐量模式、采样模式等,以满足不同的性能测试需求。
  JMH使用方法
  使用JMH编写和运行基准测试的一般步骤包括:
  · 在测试类或测试方法上使用JMH提供的注解,如@Benchmark、@State、@Setup等,来定义基准测试。
  · 使用JMH提供的命令行工具或API来运行基准测试,并指定相关的选项和参数。
  · 分析和解释JMH生成的性能报告,以评估和优化代码的性能。
  JMH使用示例
  jmh提供了大量的测试用例,参考资料【1】所示。
  @BenchmarkMode(Mode.AverageTime)
  @OutputTimeUnit(TimeUnit.NANOSECONDS)
  public class JMHSample_21_ConsumeCPU {
      /*
       * At times you require the test to burn some of the cycles doing nothing.
       * In many cases, you *do* want to burn the cycles instead of waiting.
       *
       * For these occasions, we have the infrastructure support. Blackholes
       * can not only consume the values, but also the time! Run this test
       * to get familiar with this part of JMH.
       *
       * (Note we use static method because most of the use cases are deep
       * within the testing code, and propagating blackholes is tedious).
       */
      @Benchmark
      public void consume_0000() {
          Blackhole.consumeCPU(0);
      }
      @Benchmark
      public void consume_0001() {
          Blackhole.consumeCPU(1);
      }
      @Benchmark
      public void consume_0002() {
          Blackhole.consumeCPU(2);
      }
      @Benchmark
      public void consume_0004() {
          Blackhole.consumeCPU(4);
      }
      @Benchmark
      public void consume_0008() {
          Blackhole.consumeCPU(8);
      }
      @Benchmark
      public void consume_0016() {
          Blackhole.consumeCPU(16);
      }
      @Benchmark
      public void consume_0032() {
          Blackhole.consumeCPU(32);
      }
      @Benchmark
      public void consume_0064() {
          Blackhole.consumeCPU(64);
      }
      @Benchmark
      public void consume_0128() {
          Blackhole.consumeCPU(128);
      }
      @Benchmark
      public void consume_0256() {
          Blackhole.consumeCPU(256);
      }
      @Benchmark
      public void consume_0512() {
          Blackhole.consumeCPU(512);
      }
      @Benchmark
      public void consume_1024() {
          Blackhole.consumeCPU(1024);
      }
      /*
       * ============================== HOW TO RUN THIS TEST: ====================================
       *
       * Note the single token is just a few cycles, and the more tokens
       * you request, then more work is spent (almost linearly)
       *
       * You can run this test:
       *
       * a) Via the command line:
       *    $ mvn clean install
       *    $ java -jar target/benchmarks.jar JMHSample_21 -f 1
       *    (we requested single fork; there are also other options, see -h)
       *
       * b) Via the Java API:
       *    (see the JMH homepage for possible caveats when running from IDE:
       *      http://openjdk.java.net/projects/code-tools/jmh/)
       */
      public static void main(String[] args) throws RunnerException {
          Options opt = new OptionsBuilder()
                  .include(JMHSample_21_ConsumeCPU.class.getSimpleName())
                  .forks(1)
                  .build();
          new Runner(opt).run();
      }
  }
  JMH总结
  JMH是一个强大的工具,可以帮助开发人员进行准确和可靠的Java微基准测试,以评估和改进代码的性能。它广泛应用于Java开发社区,并被认为是Java性能测试领域的事实标准。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号