Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JMH初探

JMH初探

作者头像
全栈程序员站长
发布于 2022-09-14 07:07:42
发布于 2022-09-14 07:07:42
43600
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

JMH初探

很多情况下需要做性能基准测试(benchmark)。简单的说就是,在几种类似的解决方案中,寻找效率较高的。比如对比一下thrift, protobuf, avro在对象序列化时的效率等。这种测试通常需要对被测的代码段反复执行,最后取平均值,然后横向对比几种方案。如果能有(时间、CPU、 内存、IO)曲线图表输出就更加直观了。

一开始考虑用JMeter来做,但是这个框架似乎有点大,看了几次都无从下手;另外它似乎也是偏重于http的测试。于是就在想,JUnit会怎样呢?它能够在单元测试中输出耗时,假如能够添加几个注解就能反复运行测试用例,并输出平均耗时,基本上就能满足我想要的需求了。至于图表,只要有相关的数据,绑定到基于web的图表上应该不困难。

于是开始寻找,找到了JUnitProf, JUnitBenchmarks,但是这些都是2013年左右的项目。明显是那个时候红过的,根据IT发展的速度,应该现在有更好的方案。JUnitBenchmarks的作者很给力,他在Github的该项目README中不再推荐自己的项目,而是指向了openJDK的JMH类库。大致看了一下,这可能正是我想要的。搜索了一下,发现JMH的中文资料竟然没有。OK,抢占沙发,趁Maven下载的时间,写一下这篇blog介绍给大家。首先JMH有一个示例清单,这非常符合我的习惯,对直接上代码。

JMH的调用大致分为两步,通过HelloWorld示例能够看出:

注解代码:对要被测试性能的代码添加注解,说明该方法是要被测试性能的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class JMHSample_01_HelloWorld{
    @Benchmark
    public void wellHelloThere() {
        ...
    }
}

Main函数:main方法中通过几句代码调用JMH库。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Options opt = new OptionsBuilder()
    .include(JMHSample_01_HelloWorld.class.getSimpleName())
    .forks(1)
    .build();
new Runner(opt).run();

运行,并输出结果:。。。好吧出错了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Unable to find the resource: /META-INF/BenchmarkList ...

查了一下,需要装一个maven的插件。估计是这种测试会产生一个清单文件。我用的SBT有插件,但意外发现intellij有jmh的插件,决定先用开发环境的。

运行,并输出结果:。。。又出错了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ERROR: org.openjdk.jmh.runner.RunnerException: ERROR: Exception while trying to acquire the JMH lock (C:\Windows\/jmh.lock): Access is denied, exiting. Use -Djmh.ignoreLock=true to forcefully continue.
at org.openjdk.jmh.runner.Runner.run(Runner.java:213)
at org.openjdk.jmh.Main.main(Main.java:71)

应该是windows权限导致的,java无法在C:\Windows目录下创建文件。两种解决方案。一种是以管理员权限启动intellij,另一种是如错误提示所说,通过-D参数来修改java的系统属性。我选择了前者略微简单一点。

运行,并输出结果:再次运行,终于输出了结果。。。好多。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
\# JMH 1.17.1 (released 6 days ago)
\# VM version: JDK 1.8.0_40, VM 25.40-b25
\# VM invoker: E:\softwareJava\jdk1.8.0_40\jre\bin\java.exe
\# VM options: -Dfile.encoding=UTF-8
\# Warmup: 20 iterations, 1 s each
\# Measurement: 20 iterations, 1 s each
\# Timeout: 10 min per iteration
\# Threads: 1 thread, will synchronize iterations
\# Benchmark mode: Throughput, ops/time
\# Benchmark: com.winning.jmh.A01HelloWorld.wellHelloThere

\# Run progress: 0.00% complete, ETA 00:06:40
\# Fork: 1 of 10
\# Warmup Iteration   1: 709436692.107 ops/s
\# Warmup Iteration   2: 730569792.564 ops/s
\# Warmup Iteration   3: 765307767.186 ops/s
\# Warmup Iteration   4: 755197483.232 ops/s
\# Warmup Iteration   5: 743375192.762 ops/s
\# Warmup Iteration   6: 766260254.997 ops/s
\# Warmup Iteration   7: 753854386.673 ops/s
\# Warmup Iteration   8: 752269169.477 ops/s
\# Warmup Iteration   9: 745741320.144 ops/s
\# Warmup Iteration  10: 753065182.111 ops/s
\# Warmup Iteration  11: 719067789.805 ops/s
\# Warmup Iteration  12: 671576857.682 ops/s
\# Warmup Iteration  13: 730650256.001 ops/s
\# Warmup Iteration  14: 756427486.114 ops/s
\# Warmup Iteration  15: 759877108.151 ops/s
\# Warmup Iteration  16: 761863566.643 ops/s
\# Warmup Iteration  17: 755054270.919 ops/s
\# Warmup Iteration  18: 749058811.640 ops/s
\# Warmup Iteration  19: 743062411.243 ops/s
\# Warmup Iteration  20: 747526679.280 ops/s
Iteration   1: 764938312.290 ops/s
Iteration   2: 760933669.630 ops/s
Iteration   3: 751415314.019 ops/s
Iteration   4: 731678466.990 ops/s
Iteration   5: 763481734.734 ops/s
Iteration   6: 761011109.201 ops/s
Iteration   7: 771671553.172 ops/s
Iteration   8: 749424262.582 ops/s
Iteration   9: 753785095.633 ops/s
Iteration  10: 748055399.364 ops/s
Iteration  11: 760478846.092 ops/s
Iteration  12: 755538457.364 ops/s
Iteration  13: 750751263.882 ops/s
Iteration  14: 769403132.750 ops/s
Iteration  15: 760102157.962 ops/s
Iteration  16: 775214039.242 ops/s
Iteration  17: 769234429.528 ops/s
Iteration  18: 759485848.306 ops/s
Iteration  19: 758004384.128 ops/s
Iteration  20: 746829170.489 ops/s

\# Run progress: 10.00% complete, ETA 00:06:14
\# Fork: 2 of 10
\# Warmup Iteration   1: 740566918.202 ops/s
\# Warmup Iteration   2: 733267496.702 ops/s
\# Warmup Iteration   3: 763449000.006 ops/s
\# Warmup Iteration   4: 747310549.870 ops/s
\# Warmup Iteration   5: 737317404.262 ops/s
\# Warmup Iteration   6: 765636628.060 ops/s
\# Warmup Iteration   7: 737919014.138 ops/s
\# Warmup Iteration   8: 766681999.527 ops/s
\# Warmup Iteration   9: 748907394.274 ops/s
\# Warmup Iteration  10: 773341191.093 ops/s
\# Warmup Iteration  11: 754500470.600 ops/s
\# Warmup Iteration  12: 751918118.104 ops/s
\# Warmup Iteration  13: 749708561.840 ops/s
\# Warmup Iteration  14: 748597436.525 ops/s
\# Warmup Iteration  15: 750808407.431 ops/s
\# Warmup Iteration  16: 756318252.562 ops/s
\# Warmup Iteration  17: 766339985.210 ops/s
\# Warmup Iteration  18: 756459054.119 ops/s
\# Warmup Iteration  19: 760912823.531 ops/s
\# Warmup Iteration  20: 733081391.782 ops/s
Iteration   1: 687994474.057 ops/s
Iteration   2: 680216936.519 ops/s
Iteration   3: 676976859.971 ops/s
Iteration   4: 711058348.350 ops/s
Iteration   5: 749576863.877 ops/s
Iteration   6: 767105096.966 ops/s
Iteration   7: 757357549.917 ops/s
Iteration   8: 743672094.927 ops/s
Iteration   9: 777838591.628 ops/s
Iteration  10: 775023751.599 ops/s
Iteration  11: 765926011.941 ops/s
Iteration  12: 729926424.660 ops/s
Iteration  13: 704036243.363 ops/s
Iteration  14: 722540824.391 ops/s
Iteration  15: 707073793.157 ops/s
Iteration  16: 764841869.390 ops/s
Iteration  17: 740166820.971 ops/s
Iteration  18: 759167596.660 ops/s
Iteration  19: 766200560.462 ops/s
Iteration  20: 779163549.796 ops/s

\# Run progress: 20.00% complete, ETA 00:05:31
\# Fork: 3 of 10
\# Warmup Iteration   1: 752019413.453 ops/s
\# Warmup Iteration   2: 759851858.632 ops/s
\# Warmup Iteration   3: 774238486.661 ops/s
... ...

关于测试的数量,超时规则等方面都可以通过注解来描述。这下方便多了。有兴趣的大家可以自行深挖了。这个框架应该会和java9一起来。be happy~~ ^_^

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/157495.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年7月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JMH使用指南[通俗易懂]
关于JMH,可以直接查看官网地址http://openjdk.java.net/projects/code-tools/jmh/
全栈程序员站长
2022/09/08
1.8K0
顶级Java才懂的,基准测试JMH!
最近在手写一个ID生成器,需要比较UUID和目前比较流行的 NanoID之间的速度差异,当然也要测一下根据规则自创的ID生成器。
xjjdog
2021/11/19
8520
JMH - Java 代码性能测试的终极利器、必须掌握
现在的 JVM 已经越来越为智能,它可以在编译阶段、加载阶段、运行阶段对代码进行优化。比如你写了一段不怎么聪明的代码,到了 JVM 这里,它发现几处可以优化的地方,就顺手帮你优化了一把。这对程序的运行固然美妙,却让开发者不能准确了解程序的运行情况。在需要进行性能测试时,如果不知道 JVM 优化细节,可能会导致你的测试结果差之毫厘,失之千里,同样的,Java 诞生之初就有一次编译、随处运行的口号,JVM 提供了底层支持,也提供了内存管理机制,这些机制都会对我们的性能测试结果造成不可预测的影响。
未读代码
2020/08/25
5.9K0
别再写 main 方法测试了,太 Low!这才是专业 Java 测试方法!
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/03/04
2760
在java中使用JMH(Java Microbenchmark Harness)做性能测试
在java中使用JMH(Java Microbenchmark Harness)做性能测试
程序那些事
2020/07/08
9900
性能调优必备利器之 JMH
if 快还是 switch 快?HashMap 的初始化 size 要不要指定,指定之后性能可以提高多少?各种序列化方法哪个耗时更短?
用户4172423
2020/06/12
5660
JMH使用说明「建议收藏」
JMH,即Java Microbenchmark Harness,是专门用于代码微基准测试的工具套件。何谓Micro Benchmark呢?简单的来说就是基于方法层面的基准测试,精度可以达到微秒级。当你定位到热点方法,希望进一步优化方法性能的时候,就可以使用JMH对优化的结果进行量化的分析。和其他竞品相比——如果有的话,JMH最有特色的地方就是,它是由Oracle内部实现JIT的那拨人开发的,对于JIT以及JVM所谓的“profile guided optimization”对基准测试准确性的影响可谓心知肚明(smile)
全栈程序员站长
2022/09/08
1.2K0
JMH使用说明「建议收藏」
JMH 简单入门
JMH 是 Java Microbenchmark Harness 的缩写。中文意思大致是 “JAVA 微基准测试套件”。首先先明白什么是“基准测试”。百度百科给的定义如下:
KIWI
2020/04/08
1K0
架构师Java 并发基准测试神器的-JMH,程序员必看!
在Java编程这个行业里面性能测试这个话题非常庞大,我们可以从网络聊到操作系统,再从操作系统聊到内核,再从内核聊到你怀疑人生有木有。
Java架构师进阶技术
2020/01/31
9370
架构师Java 并发基准测试神器的-JMH,程序员必看!
JMH入门
JMH是Java Micro Benchmark Harness的简写,是专门用于代码微基准测试的工具集(toolkit)。JMH是由实现Java虚拟机的团队开发的,因此他们非常清楚开发者所编写的代码在虚拟机中将会如何执行。 由于现代JVM已经变得越来越智能,在Java文件的编译阶段、类的加载阶段,以及运行阶段都可能进行了不同程度的优化,因此开发者编写的代码在运行中未必会像自己所预期的那样具有相同的性能体现,JVM的开发者为了让普通开发者能够了解自己所编写的代码运行的情况,JMH便因此而生。
全栈程序员站长
2022/09/18
3780
别只会 main 方法做测试,太 Low!这才是专业 Java 测试方法!
前言 “"If you cannot measure it, you cannot improve it". 在日常开发中,我们对一些代码的调用或者工具的使用会存在多种选择方式,在不确定他们性能的时候,我们首先想要做的就是去测量它。大多数时候,我们会简单的采用多次计数的方式来测量,来看这个方法的总耗时。 但是,如果熟悉JVM类加载机制的话,应该知道JVM默认的执行模式是JIT编译与解释混合执行。JVM通过热点代码统计分析,识别高频方法的调用、循环体、公共模块等,基于JIT动态编译技术,会将热点代码转换成机
java思维导图
2022/03/21
3280
JMH实践-代码性能测试工具
概述 JMH,即Java Microbenchmark Harness,是专门用于代码微基准测试的工具套件 JMH比较典型的应用场景有: 想准确的知道某个方法需要执行多长时间,以及执行时间和输入之间的相关性; 对比接口不同实现在给定条件下的吞吐量; 查看多少百分比的请求在多长时间内完成; 基本概念 模式 Throughput: 整体吞吐量,例如“1秒内可以执行多少次调用”。 AverageTime: 调用的平均时间,例如“每次调用平均耗时xxx毫秒”。 SampleTime: 随机取样,最后输出取样结果
老梁
2019/09/10
1.8K0
别再写 main 方法测试了,太 Low!这才是专业 Java 测试方法!
来源:https://juejin.cn/post/6844903936869007368 前言 "If you cannot measure it, you cannot improve it". 在日常开发中,我们对一些代码的调用或者工具的使用会存在多种选择方式,在不确定他们性能的时候,我们首先想要做的就是去测量它。大多数时候,我们会简单的采用多次计数的方式来测量,来看这个方法的总耗时。 但是,如果熟悉JVM类加载机制的话,应该知道JVM默认的执行模式是JIT编译与解释混合执行。JVM通过热点代码统
java思维导图
2022/03/04
4030
不要再用main方法测试代码性能了,用这款JDK自带工具
作为软件开发人员,我们通常会写一些测试程序用来对比不同算法、不同工具的性能问题。而最常见的做法是写一个main方法,构造模拟场景进行并发测试。
程序新视界
2021/01/13
4950
关于四种获取当前执行方法名称方案的基准测试报告
本文是对作者上一篇文章中 Java 面试题之 Logback 打印日志是如何获取当前方法名称的?介绍的四种获取当前执行方法名称方案的基准测试报告。这四种方法如下,
wayn
2023/11/13
4390
关于四种获取当前执行方法名称方案的基准测试报告
关于四种获取当前执行方法名称方案的基准测试报告
本文是对作者上一篇文章中 Java 面试题之 Logback 打印日志是如何获取当前方法名称的? 介绍的四种获取当前执行方法名称方案的基准测试报告。这四种方法如下,
wayn
2023/11/14
3690
关于四种获取当前执行方法名称方案的基准测试报告
【JUC进阶】10. 使用JMH进行性能测试
软件开发中,除要写出正确的代码之外,还需要写出高效的代码。这在并发编程中更加重要,原因主要有两点。首先,一部分并发程序由串行程序改造而来,其目的就是提高系统性能,因此,自然需要有一种方法对两种算法进行性能比较。其次,由于业务原因引入的多线程有可能因为线程并发控制导致性能损耗,因此要评估损耗的比重是否可以接受。无论出自何种原因需要进行性能评估,量化指标总是必要的。在大部分场合,简单地回答谁快谁慢是远远不够的,如何将程序性能量化呢? 这就是本节要介绍的 Java 微基准测试框架JMH。
有一只柴犬
2024/01/25
4000
【JUC进阶】10. 使用JMH进行性能测试
Java基准性能测试--JMH使用介绍
JMH是Java Microbenchmark Harness的简称,一个针对Java做基准测试的工具,是由开发JVM的那群人开发的。想准确的对一段代码做基准性能测试并不容易,因为JVM层面在编译期、运行时对代码做很多优化,但是当代码块处于整个系统中运行时这些优化并不一定会生效,从而产生错误的基准测试结果,而这个问题就是JMH要解决的。
Kevin_Zhang
2021/07/01
9930
JMH: 最牛逼的基准测试工具套件
官网:http://openjdk.java.net/projects/code-tools/jmh/
全栈程序员站长
2022/09/18
1K0
JMH: 最牛逼的基准测试工具套件
JMH探索
JMH,即Java Microbenchmark Harness,是专门用于Java代码微基准测试的工具套件。由OpenJDK开发的,主要是基于方法层面的基准测试,精度可以达到纳秒级。当定位到热点方法,希望进一步优化方法性能的时候,就可以使用JMH对优化的结果进行量化分析。
全栈程序员站长
2022/09/18
4070
JMH探索
相关推荐
JMH使用指南[通俗易懂]
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
加入讨论
的问答专区 >
大数据开发工程师擅长4个领域
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档