JMH:如何设置和运行JMH基准
健康警告!
这篇文章描述了如何设置和运行简单的JMH基准测试。 众所周知,微基准测试很难正确设置,即使您确实正确设置了(通过使用JMH之类的工具),它们仍然会产生误导。 仅仅因为您的代码在极端孤立的人为情况下以某种方式运行,并不意味着它将在您的生产代码内以相同的方式运行。 仅举几个例子,在实际程序中,CPU缓存将受到代码其他部分的压力,任何对象的创建都会对GC产生下游影响,而JIT可能从您的其他部分内联并编译了代码与您基准测试的代码冲突的代码。 不过,微型基准确实有其地位,如果您打算使用微型基准,那么最好还是与JMH一起正确地执行。
在最近的一篇文章中,我被要求执行我的测试作为JMH性能基准。
JMH是用于构建,运行和分析以Java和其他针对JVM的其他语言编写的nano / micro / milli / macro基准测试的Java工具。 在此处查看完整文档。
JMH之所以如此出色,是因为它负责预热迭代,分派JVM进程,以使基准不会互相干扰,整理结果并以统一的方式呈现。 还有更多。
我听过很多有关JMH的信息,看到过许多JMH的结果,但我自己却从未真正运行过。 太简单了! 这就是我做的。
将这些依赖项添加到您的Maven pom.xml文件中:
<dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-core</artifactId><version>1.5.1</version></dependency><dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-generator-annprocess</artifactId><version>1.5.1</version>
</dependency>
然后确定要进行基准测试的方法,并向其添加注释@Benchmark。 如果您需要任何初始化代码,请将其添加到应标记为@Setup的方法中。
运行基准测试的最简单方法是通过将该实现添加到您的main方法中来进行添加。 (有关运行测试的其他方法,请参见此处 )。
public static void main(String[] args) throws RunnerException {Options opt = new OptionsBuilder().include(MyBenchmark.class.getSimpleName()).forks(1).build();new Runner(opt).run();
}
然后像运行任何普通程序一样运行,您将获得所有JMH的好处!
作为查看JMH基准格式的示例,我的结果如下所示:
Benchmark Mode Cnt Score Error Units
CompTestBenchmark.bmCustomComparator thrpt 20 2598.617 ± 67.634 ops/s
CompTestBenchmark.bmJDKComparator thrpt 20 751.110 ± 14.835 ops/s
CompTestBenchmark.bmNoVTLComparator thrpt 20 1348.750 ± 30.382 ops/s
CompTestBenchmark.bmNoVTLOrAutoBoxingComparator thrpt 20 2202.995 ± 43.673 ops/s
有大量的花哨的技巧可以微调您的基准,我不会在这里讨论,但希望这能使您正常运行。
- 有关我的测试的完整代码列表,请参见此处 。
翻译自: https://www.javacodegeeks.com/2015/02/jmh-setup-run-jmh-benchmark.html
JMH:如何设置和运行JMH基准相关推荐
- jmh 基准测试_JMH:如何设置和运行JMH基准
jmh 基准测试 健康警告! 这篇文章描述了如何设置和运行简单的JMH基准测试. 众所周知,微基准测试很难正确设置,即使您确实正确设置了(通过使用JMH之类的工具),它们仍然会产生误导. 仅仅因为您的 ...
- 使用Boost.Compute类在GPU上设置和运行简单的矢量加法内核
Boost:使用Boost.Compute类在GPU上设置和运行简单的矢量加法内核 实现功能 C++实现代码 实现功能 Boost的compute模块,使用Boost.Compute类在GPU上设置和 ...
- 将数据库设置为运行在限制模式下
将数据库设置为运行在限制模式下 如果要维护数据库的结果或者要对数据库进行数据的导出导入操作时,此时应该尽量限制其他会话进程,保证数据库的操作运行在安全状态下.同时对使用数据的库的用户也可以起到避免读取 ...
- LoadRunner中Action的迭代次数的设置和运行场景中设置
LoadRunner中Action的迭代次数的设置和运行场景中设置 LoadRunner是怎么重复迭代和怎么增加并发运行的呢? 另外,在参数化时,对于一次压力测试中均只能用一次的资源应该怎么参数化呢? ...
- PP视频怎么设置可以运行多个客户端
今天继续给大家分享PP视频方面的内容.PP视频怎么设置可以运行多个客户端.PP视频客户端是国内领先的视频播放器,以 "快者为王"为产品理念,注重用户体验,为用户提供视频播放,视频发 ...
- notepad可以运行python吗,notepad+中怎么设置直接运行python代码
在notepad+中设置直接运行python的代码 在notepad++界面中按F5(或者在菜单栏中选择"运行"),此时会出现下图界面(初次使用这里面是空的): 然后输入:cmd ...
- java quartz下载_下载、设置和运行Quartz(GUI)图形界面程序----Quartz Web
一.获取Quartz Web程序(Quartz GUI).早期的 Quartz 框架开发者意识到一个 GUI 对于某类用户群体是必需的.几年前,一个 Web 应用被创立,它可用于管理 Quartz 框 ...
- 当前安全设置禁止运行该页中activeX控件,该页无法正常显示
运行services查看服务时,当前安全设置禁止运行该页中activeX控件,该页无法正常显示:打开一个project文件时,也显示 当前安全设置禁止运行该页中activeX控件,该页无法正常显示. ...
- 基于MFC C++设置进程运行显示器
最近遇到项目,需要在单台电脑上运行两次同一个.exe文件(基于对话框),但两个进程需要在不同的屏幕上显示.在网上查找了一些资料,要么付费,要么代码中有一定问题.综合各个资料后,整理出可以直接使用的代码 ...
最新文章
- 最不安全的网络管理员大盘点
- loadrunner- winsock 函数总结
- 手把手教你用OpenCV实现机器学习最简单的k-NN算法(附代码)
- 陌屿云PHP代码在线加密系统6.0源码 可添加小马
- 从谷歌浏览器复制不带样式_如何更新ETHERSCAN区块链浏览器上的代币信息
- android学习笔记-udacity/Sunshine-Version-2出错
- [技术评论]龙芯电脑
- 康乐忆享|志愿者心得精选——张凌旭
- [工业互联-2]:工业有线互联总线之CAN总线
- 基于单片机电梯5层带模拟控制系统设计(毕设)
- NMOS与PMOS的导通条件与使用方法
- 3D_systems_touch控制Dobot魔术师
- 计算机组装师分为哪几步,电脑组装主要需要学习哪几个方面?难学吗?
- 物联网卡就是不能打电话的电话卡?
- 教育数据集——豆豆云助教
- (深度学习)前馈神经网络—全连接网络的一般流程
- c语言pta运行时错误,求助大佬PTA提交结果有个结果是运行时错误,是什么原因啊?...
- 展望2007,十类经典装机软件(全心收集了39款!)
- 视频倒放怎么弄出来?这几个小方法轻松解决这个难题
- ubuntu查看系统桌面的环境
热门文章
- volatile可以保证原子性吗
- spark sql uv_使用Spark Streaming SQL进行PV/UV统计
- 作为 IT 行业的过来人,你有什么话想对后辈说的?2
- 2020年日历电子版(打印版)_“温故知新”——2020年《故宫日历》(青少版)正式发布...
- mybatis_user_guide(4) Mapper XML 文件
- aws dynamodb_使用适用于Java 2的AWS开发工具包的AWS DynamoDB版本字段
- java记录目录树_Java记录
- oracle密码不能重复用_重复码
- spring boot简介_Spring Boot简介
- g++默认字符集utf-8_Java可能使用UTF-8作为其默认字符集