在java中使用JMH(Java Microbenchmark Harness)做性能测试

JMH的全称是Java Microbenchmark Harness,是一个open JDK中用来做性能测试的套件。该套件已经被包含在了JDK 12中。

本文将会讲解如何使用JMH来在java中做性能测试。

如果你使用的不是JDK 12,那么需要添加如下依赖:

org.openjdk.jmh

jmh-core

1.19

org.openjdk.jmh

jmh-generator-annprocess

1.19

使用JMH做性能测试

如果我们想测试某个方法的性能,一般来说就是重复执行某个方法n次,求出总的执行时间,然后求平均值。

但是这样通常会有一些问题,比如程序的头几次执行通常会比较慢,因为JVM会对多次执行的代码进行优化。另外得出的统计结果也不够直观,需要我们自行解析。

如果使用JMH可以轻松解决这些问题。

在JMH中,将要测试的方法添加@Benchmark注解即可:

@Benchmark

public void measureThroughput() throws InterruptedException {

TimeUnit.MILLISECONDS.sleep(100);

}

看下怎么调用:

public static void main(String[] args) throws RunnerException {

Options opt = new OptionsBuilder()

.include(BenchMarkUsage.class.getSimpleName())

// .include(BenchMarkUsage.class.getSimpleName()+".*measureThroughput*")

// 预热3轮

.warmupIterations(3)

// 度量5轮

.measurementIterations(5)

.forks(1)

.build();

new Runner(opt).run();

}

上面的例子,我们通过OptionsBuilder的include方法添加了需要进行测试的类。

默认情况下,该类的所有@Benchmark方法都将会被测试,如果我们只想测试其中的某个方法,我们可以在类后面加上方法的名字:

.include(BenchMarkUsage.class.getSimpleName()+".*measureAll*")

上面的代码支持通配符。

warmupIterations(3)意思是在真正的执行前,先热身三次。

measurementIterations(5)表示我们将方法运行5次来测试性能。

forks(1)表示启动一个进程来执行这个任务。

上面是最基本的运行,我们看下运行结果:

# JMH version: 1.19

# VM version: JDK 1.8.0_171, VM 25.171-b11

# VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/bin/java

# VM options: -javaagent:/Applications/IntelliJ IDEA 2.app/Contents/lib/idea_rt.jar=55941:/Applications/IntelliJ IDEA 2.app/Contents/bin -Dfile.encoding=UTF-8

# Warmup: 3 iterations, 1 s each

# Measurement: 5 iterations, 1 s each

# Timeout: 10 min per iteration

# Threads: 1 thread, will synchronize iterations

# Benchmark mode: Throughput, ops/time

# Benchmark: com.flydean.BenchMarkUsage.measureThroughput

# Run progress: 26.66% complete, ETA 00:01:42

# Fork: 1 of 1

# Warmup Iteration 1: 9.727 ops/s

# Warmup Iteration 2: 9.684 ops/s

# Warmup Iteration 3: 9.678 ops/s

Iteration 1: 9.652 ops/s

Iteration 2: 9.678 ops/s

Iteration 3: 9.733 ops/s

Iteration 4: 9.651 ops/s

Iteration 5: 9.678 ops/s

Result "com.flydean.BenchMarkUsage.measureThroughput":

9.678 ±(99.9%) 0.129 ops/s [Average]

(min, avg, max) = (9.651, 9.678, 9.733), stdev = 0.034

CI (99.9%): [9.549, 9.808] (assumes normal distribution)

ops/s 是每秒的OPS次数。程序会给出运行的最小值,平均值和最大值。同时给出标准差stdev和置信区间CI。

BenchmarkMode

上面的例子中, 我们只用了最简单的@Benchmark。如果想实现更加复杂和自定义的BenchMark,我们可以使用@BenchmarkMode。

先举个例子:

@Benchmark

@BenchmarkMode(Mode.Throughput)

@OutputTimeUnit(TimeUnit.SECONDS)

public void measureThroughput() throws InterruptedException {

TimeUnit.MILLISECONDS.sleep(100);

}

上面的例子中,我们指定了@BenchmarkMode(Mode.Throughput),Throughput的意思是整体吞吐量,表示给定的时间内执行的次数。

这里我们通过 @OutputTimeUnit(TimeUnit.SECONDS)来指定时间单位。

Mode除了Throughput还有如下几种模式:

AverageTime – 调用的平均时间

SampleTime – 随机取样,最后输出取样结果的分布

SingleShotTime – 只会执行一次,通常用来测试冷启动时候的性能。

All – 所有的benchmark modes。

Fork和Warmup

上面的例子中我们通过代码来显式的制定Fork和Warmup,我们也可以使用注解来实现:

@Fork(value = 1, warmups = 2)

@Warmup(iterations = 5)

上面的例子中value表示该benchMark执行多少次,warmups表示fork多少个进程来执行。iterations表示warmup的iterations个数。

如果你同时在代码中和注解中都配置了相关的信息,那么注解将会覆盖掉代码中的显示配置。

State和Scope

如果我们在多线程环境中使用beachMark,那么多线程中用到的类变量是共享还是每个线程一个呢?

这个时候我们就要用到@State注解。

@State(Scope.Benchmark)

public class StateUsage {

}

Scope有三种:

Scope.Thread:默认的State,每个测试线程分配一个实例;

Scope.Benchmark:所有测试线程共享一个实例,用于测试有状态实例在多线程共享下的性能;

Scope.Group:每个线程组共享一个实例;

benchmark java_java使用JMH Java Microbenchmark Harness性能测试 | 程序那些事相关推荐

  1. JMH(Java Microbenchmark Harness, java微基准测试工具)

    JMH是什么 JMH是Java Microbenchmark Harness(java 微基准测试工具)的简称,是openJDK的一部分. JMH VS JMeter 看来简单比较下他们俩.JMete ...

  2. 笔记-JMH(Java Microbenchmark Harness)

    更多请移步我的博客 看开源项目时,时不常遇到一个叫做benchmark的目录,此时脑子停滞,一眼带过,最近一次看到就顺手问了下谷大哥,发现benchmark还是个挺有意思的东西. 基准测试是什么 基准 ...

  3. 基准测试神器 - JMH [ Java Microbenchmark Harness ]

    Table of Contents 一. 简介 二. 安装 [ idea plug ] 三. 注解 @Benchmark @Warmup @Measurement @BenchmarkMode @Ou ...

  4. JMH(Java Microbenchmark Harness) Java微基准测试

    官网:OpenJDK: jmh 什么是JMH?微基准测试,他是测的某一个方法的性能到底是好或者不好,换了方法的实现之后他的性能到底好还是不好 创建JMH测试 创建Maven项目,添加依赖,我们需要添加 ...

  5. benchmark java_在java中使用JMH(Java Microbenchmark Harness)做性能测试

    JMH的全称是Java Microbenchmark Harness,是一个open JDK中用来做性能测试的套件.该套件已经被包含在了JDK 12中. 本文将会讲解如何使用JMH来在java中做性能 ...

  6. 在java中使用JMH(Java Microbenchmark Harness)做性能测试

    文章目录 使用JMH做性能测试 BenchmarkMode Fork和Warmup State和Scope 在java中使用JMH(Java Microbenchmark Harness)做性能测试 ...

  7. Java Microbenchmark Harness (JMH)

    Java Microbenchmark Harness (JMH) http://albertnetymk.github.io/2017/12/27/jmh/(此文档是安装过程) https://gi ...

  8. 【转】java接口的性能测试

    这周尝试了一把性能测试,之前都是测试网站的性能测试,java接口的性能测试还是头一次,学到了很多,特此分享一下. 主要用到了两个性能测试工具,一个是jmeter,一个是LoadRunner. 使用jm ...

  9. Java Stream API性能测试

    Java Stream API性能测试 已经对Stream API的用法鼓吹够多了,用起简洁直观,但性能到底怎么样呢?会不会有很高的性能损失?本节我们对Stream API的性能一探究竟. 为保证测试 ...

最新文章

  1. Matlab读写二进制文件
  2. JZOJ 5898. 【NOIP2018模拟10.6】距离统计
  3. 记一次 Vue 移动端活动倒计时优化
  4. Super Mario HDU - 4417(主席树解决区间数字小于k的个数||线段树+离线)
  5. 使用VS2015进行C++开发的6个主要原因
  6. vue 给取data值_web前端教程分享Vue相关面试题
  7. 执行 redis-dump 报错:Error connecting to Redis on localhost:6379 (Redis::TimeoutError)
  8. 【爬虫剑谱】三卷3章 拾遗篇-有关于bs4库中的BeautifulSoup模块使用小结
  9. 63万张!旷视发布最大物体检测数据集Objects365,物体检测竞赛登陆CVPR
  10. OSPF Sham-Link
  11. 嵌入式开发技术汇总001+modbus RTU调试四件套 : modbus poll 7 ; modbus slave 6;modscan32;MThings 使用教程
  12. 温度、水汽压、湿度计算公式
  13. 802.11 Beacon帧
  14. 使用 Travis-CI 部署 HEXO 博客
  15. 软件测试创业公司和大厂外包如何选择?
  16. jdbc写入数据库乱码问题
  17. 前沿人物(零)——伯特霍尔德霍恩
  18. 论文翻译:2020_RNNoise:A Hybrid DSP/Deep Learning Approach to Real-Time Full-Band Speech Enhancement...
  19. 富力等待黎明:李思廉走在还债的漫漫长路
  20. Linux进程调用execve,关于linux:在C语言中使用execve loader时子进程如何终止

热门文章

  1. 【国货之光】GD32E230F4使用硬件IIC+DMA读写24C04
  2. OC8051内部逻辑分析(1)
  3. I + I2C = I3C:这个附加的“I”是什么?
  4. Python后台开发基础——Web前端基础
  5. Pi-puck的ROS开发之路
  6. 把妹导论第二版(Hunting-Girls Introduction II)
  7. 只管去做:让你迅速实现增值的目标管理法
  8. 解决Identify and stop the process that‘s listening on port 8080 端口问题
  9. 编程语言名称背后的有趣故事
  10. 避震方法最新自救建议:不要躲在桌子下