zoukankan      html  css  js  c++  java
  • JMH-Java MIC肉benchmarkHarness 微基准测试

    什么是JMH

    官网

    http://openjdk.java.net/projects/code-tools/jmh/

    创建JMH测试

    1. 创建Maven项目,添加依赖

      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
      
          <properties>
              <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
              <encoding>UTF-8</encoding>
              <java.version>1.8</java.version>
              <maven.compiler.source>1.8</maven.compiler.source>
              <maven.compiler.target>1.8</maven.compiler.target>
          </properties>
      
          <groupId>mashibing.com</groupId>
          <artifactId>HelloJMH2</artifactId>
          <version>1.0-SNAPSHOT</version>
      
      
          <dependencies>
              <!-- https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-core -->
              <dependency>
                  <groupId>org.openjdk.jmh</groupId>
                  <artifactId>jmh-core</artifactId>
                  <version>1.21</version>
              </dependency>
      
              <!-- https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-generator-annprocess -->
              <dependency>
                  <groupId>org.openjdk.jmh</groupId>
                  <artifactId>jmh-generator-annprocess</artifactId>
                  <version>1.21</version>
                  <scope>test</scope>
              </dependency>
          </dependencies>
      
      
      </project>
      
    2. idea安装JMH插件 JMH plugin v1.0.3

    3. 由于用到了注解,打开运行程序注解配置

      compiler -> Annotation Processors -> Enable Annotation Processing

    4. 定义需要测试类PS (ParallelStream)

      package com.mashibing.jmh;
      
      import java.util.ArrayList;
      import java.util.List;
      import java.util.Random;
      
      public class PS {
      
      	static List<Integer> nums = new ArrayList<>();
      	static {
      		Random r = new Random();
      		for (int i = 0; i < 10000; i++) nums.add(1000000 + r.nextInt(1000000));
      	}
      
      	static void foreach() {
      		nums.forEach(v->isPrime(v));
      	}
      
      	static void parallel() {
      		nums.parallelStream().forEach(PS::isPrime);
      	}
      	
      	static boolean isPrime(int num) {
      		for(int i=2; i<=num/2; i++) {
      			if(num % i == 0) return false;
      		}
      		return true;
      	}
      }
      
    5. 写单元测试

      这个测试类一定要在test package下面

      package com.mashibing.jmh;
      
      import org.openjdk.jmh.annotations.Benchmark;
      
      import static org.junit.jupiter.api.Assertions.*;
      
      public class PSTest {
       @Benchmark
       public void testForEach() {
           PS.foreach();
       }
      }
      
    6. 运行测试类,如果遇到下面的错误:

      ERROR: org.openjdk.jmh.runner.RunnerException: ERROR: Exception while trying to acquire the JMH lock (C:WINDOWS/jmh.lock): C:WINDOWSjmh.lock (拒绝访问。), exiting. Use -Djmh.ignoreLock=true to forcefully continue.
      	at org.openjdk.jmh.runner.Runner.run(Runner.java:216)
      	at org.openjdk.jmh.Main.main(Main.java:71)
      

      这个错误是因为JMH运行需要访问系统的TMP目录,解决办法是:

      打开RunConfiguration -> Environment Variables -> include system environment viables

    7. 阅读测试报告

    JMH中的基本概念

    1. Warmup
      预热,由于JVM中对于特定代码会存在优化(本地化),预热对于测试结果很重要

    2. Mesurement
      总共执行多少次测试

    3. Timeout

    4. Threads
      线程数,由fork指定

    5. Benchmark mode
      基准测试的模式

    6. Benchmark
      测试哪一段代码

    Next

    官方样例:
    http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/

  • 相关阅读:
    [原创]二路归并排序针对数组的场景(C++版)
    [原创]装饰模式(java版)
    [原创]Java中Map根据值(value)进行排序实现
    [原创]适配器模式(java版)
    信了你的邪
    String和Date转换
    电商运营面试题
    springCloud发送请求多对象参数传递问题
    JS实现页面以年月日时分秒展示时间
    java三种注释以及参数涵义(转)
  • 原文地址:https://www.cnblogs.com/farmersun/p/12686797.html
Copyright © 2011-2022 走看看