JMH

JMH

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

创建JMH测试

1.注入依赖:

<?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.sourceUEncoding>UTF-8</project.build.sourceUEncoding>
        <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>org.example</groupId>
    <artifactId>Test_JMH</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 plugin

file>Settings>Plugins>JMH plugin

3。注解配置

compiler->Annotation Procesors->Enable Annotation Procession

4.定义测试类PS(ParallelStream)

写了一个类,并行处理流的程序,定义了一个list集合,往这个集合里仍了1000个数。第一个方法是用foreach来判断我们这1000个线程里到底有谁是质数,第二个是使用并行处理流的方法来把集合的数分成若干份 同时判断的。

package com.gaozhenhua;

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();
        //往集合里面仍了1000个数
        for (int i = 0; i <10000 ; i++) nums.add(1000000+r.nextInt(1000000));
    }
        static void foreach(){
        //使用foreach判断是否是质数  (这里调用的是prime方法)
        nums.forEach(v->isPrime(v));
        }

        static void paraller(){
        //使用并行处理流 来判断质数
            //把这个集合的数分成若干份 同时处理
        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。写单元测试(PSTest)

注意:这个测试类一定要再test package下面

我们对这个方法进行测试testforeach,很简单我就调用PS这个类的foreach就行了,对他的厕所最关键的是我加了这个注解@Benchmark,这个JMH的注解,是要被JMH解析处理的

package com.gaozhenhua;

import org.openjdk.jmh.annotations.*;

public class PSTest {
    @Benchmark
        @Warmup(iterations=1,time = 3)//在专业测试里面首先要进行预热,预热次数和预热时间
    @Fork(5)//意思是用多少个线程去执行我们的程序
    @BenchmarkMode(Mode.Throughput)//是对基准测试的一个模式,这个模式用的最多的是Throughput吞吐量
    @Measurement(iterations = 1,time = 3)//这个是整个测试要测试多少遍,调用这个方法要调用多少次

    public void testForEach(){
        PS.foreach();
    }
}

6.运行测试类

运行之后会遇到下面的错误

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

7.最后 阅读测试报告

总结 :JMH中的基本概念

  • Warmup:预热,由于JVM中对于特定代码会存在优化(本地化),预热对于测试结果很重要
  • Mesurement:总共执行多少次测试
  • Timeout
  • Threads:线程数,有fork指定
  • Benchmark mode:最基准的模式
  • Benchmark :测试哪一段代码
原文地址:https://www.cnblogs.com/beizhai/p/13796280.html