benchmark java_java使用JMH Java Microbenchmark Harness性能测试 | 程序那些事
在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性能测试 | 程序那些事相关推荐
- JMH(Java Microbenchmark Harness, java微基准测试工具)
JMH是什么 JMH是Java Microbenchmark Harness(java 微基准测试工具)的简称,是openJDK的一部分. JMH VS JMeter 看来简单比较下他们俩.JMete ...
- 笔记-JMH(Java Microbenchmark Harness)
更多请移步我的博客 看开源项目时,时不常遇到一个叫做benchmark的目录,此时脑子停滞,一眼带过,最近一次看到就顺手问了下谷大哥,发现benchmark还是个挺有意思的东西. 基准测试是什么 基准 ...
- 基准测试神器 - JMH [ Java Microbenchmark Harness ]
Table of Contents 一. 简介 二. 安装 [ idea plug ] 三. 注解 @Benchmark @Warmup @Measurement @BenchmarkMode @Ou ...
- JMH(Java Microbenchmark Harness) Java微基准测试
官网:OpenJDK: jmh 什么是JMH?微基准测试,他是测的某一个方法的性能到底是好或者不好,换了方法的实现之后他的性能到底好还是不好 创建JMH测试 创建Maven项目,添加依赖,我们需要添加 ...
- benchmark java_在java中使用JMH(Java Microbenchmark Harness)做性能测试
JMH的全称是Java Microbenchmark Harness,是一个open JDK中用来做性能测试的套件.该套件已经被包含在了JDK 12中. 本文将会讲解如何使用JMH来在java中做性能 ...
- 在java中使用JMH(Java Microbenchmark Harness)做性能测试
文章目录 使用JMH做性能测试 BenchmarkMode Fork和Warmup State和Scope 在java中使用JMH(Java Microbenchmark Harness)做性能测试 ...
- Java Microbenchmark Harness (JMH)
Java Microbenchmark Harness (JMH) http://albertnetymk.github.io/2017/12/27/jmh/(此文档是安装过程) https://gi ...
- 【转】java接口的性能测试
这周尝试了一把性能测试,之前都是测试网站的性能测试,java接口的性能测试还是头一次,学到了很多,特此分享一下. 主要用到了两个性能测试工具,一个是jmeter,一个是LoadRunner. 使用jm ...
- Java Stream API性能测试
Java Stream API性能测试 已经对Stream API的用法鼓吹够多了,用起简洁直观,但性能到底怎么样呢?会不会有很高的性能损失?本节我们对Stream API的性能一探究竟. 为保证测试 ...
最新文章
- Matlab读写二进制文件
- JZOJ 5898. 【NOIP2018模拟10.6】距离统计
- 记一次 Vue 移动端活动倒计时优化
- Super Mario HDU - 4417(主席树解决区间数字小于k的个数||线段树+离线)
- 使用VS2015进行C++开发的6个主要原因
- vue 给取data值_web前端教程分享Vue相关面试题
- 执行 redis-dump 报错:Error connecting to Redis on localhost:6379 (Redis::TimeoutError)
- 【爬虫剑谱】三卷3章 拾遗篇-有关于bs4库中的BeautifulSoup模块使用小结
- 63万张!旷视发布最大物体检测数据集Objects365,物体检测竞赛登陆CVPR
- OSPF Sham-Link
- 嵌入式开发技术汇总001+modbus RTU调试四件套 : modbus poll 7 ; modbus slave 6;modscan32;MThings 使用教程
- 温度、水汽压、湿度计算公式
- 802.11 Beacon帧
- 使用 Travis-CI 部署 HEXO 博客
- 软件测试创业公司和大厂外包如何选择?
- jdbc写入数据库乱码问题
- 前沿人物(零)——伯特霍尔德霍恩
- 论文翻译:2020_RNNoise:A Hybrid DSP/Deep Learning Approach to Real-Time Full-Band Speech Enhancement...
- 富力等待黎明:李思廉走在还债的漫漫长路
- Linux进程调用execve,关于linux:在C语言中使用execve loader时子进程如何终止
热门文章
- 【国货之光】GD32E230F4使用硬件IIC+DMA读写24C04
- OC8051内部逻辑分析(1)
- I + I2C = I3C:这个附加的“I”是什么?
- Python后台开发基础——Web前端基础
- Pi-puck的ROS开发之路
- 把妹导论第二版(Hunting-Girls Introduction II)
- 只管去做:让你迅速实现增值的目标管理法
- 解决Identify and stop the process that‘s listening on port 8080 端口问题
- 编程语言名称背后的有趣故事
- 避震方法最新自救建议:不要躲在桌子下