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 :测试哪一段代码