JMH初探

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

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

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示例能够看出:

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

    public class JMHSample_01_HelloWorld{
        @Benchmark
        public void wellHelloThere() {
            ...
        }
    }
    
  2. Main函数:main方法中通过几句代码调用JMH库。

    Options opt = new OptionsBuilder()
        .include(JMHSample_01_HelloWorld.class.getSimpleName())
        .forks(1)
        .build();
    new Runner(opt).run();
    
  3. 运行,并输出结果:。。。好吧出错了。

    Unable to find the resource: /META-INF/BenchmarkList ...
    

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

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

    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的系统属性。我选择了前者略微简单一点。

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

    \# 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.net/157495.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java培训学费_北京Java培训班学费很贵吗,包含了哪些收费项目

    java培训学费_北京Java培训班学费很贵吗,包含了哪些收费项目原标题:北京Java培训班学费很贵吗,包含了哪些收费项目北京的Java培训班有很多,价格却是相差不多的,但培训的课程就参差不齐了,有的培训班就是为了赚钱而存在的,想要系统的学习Java,确保学习效果,那么你一定要挑选正规的Java培训班,挑选适合自己的Java课程,培训费用可以在和机构老师详谈。我们先来看看Java培训机构的收费情况,学费都包含了哪些呢?专业的Java培训在硬件设施上,在师资力量上…

    2022年7月8日
    19
  • 使用树莓派实现的口罩检测

    使用树莓派实现的口罩检测基于树莓派3B+官方摄像头两个指示灯实现的口罩检测项目演示链接口罩检测项目地址使用的口罩检测项目是AIZOO团队实现的使用的是目标检测常用的SSD算法。(由于疫情在家连不上实验室的服务器我无法训练)项目GitHub链接AIZOO团队给出的代码在Windows上很容易以跑通。配置的环境相对比较容易。也不需要很复杂的更改代码。因为模型较小我想出要在树莓派上运行,就进行了一些尝试。但是要在树莓派上运行需要修改一些代码。树莓派配置参考链接有很多基础配置对树莓派进行换源.

    2022年6月5日
    132
  • vscode 自动补全html代码的插件_vimhtml5自动补全

    vscode 自动补全html代码的插件_vimhtml5自动补全不需要插件,VSCode代码自动补全(html标签、style样式、css属性及值、),修改配置文件即可完成!效果图·演示如下:操作步骤·如下:本编辑器已经汉化,所以截图如下。首先,取消选中(控制在活动代码片段内是否禁用快速建议)修改路径(截图示下):设置–>文本编辑器(建议)–>取消选中Suggest:SnippetsPreventQ…

    2022年8月14日
    1
  • python sobel滤波_Sobel滤波器

    python sobel滤波_Sobel滤波器一.sobel滤波器介绍sobel滤波器常用来提取灰度图像的水平边缘(水平特征)和竖直边缘(竖直特征)二.sobel算子纵向算子,提取图像水平边缘↑横向算子,提取图像竖直边缘↑三.实验:python实现sobel算子并将算子作用于图像importcv2importnumpyasnp#GrayscaledefBGR2GRAY(img):b=img[:,:,0].cop…

    2022年10月25日
    0
  • webpackdevtool配置简单对比简书_钢铁雄心4toolpack

    webpackdevtool配置简单对比简书_钢铁雄心4toolpack官方手册传送门官方对devtool配置的定义很简单:选择一种sourcemap格式来增强调试过程,不同的值会明显影响到构建build和重新构建rebuild的速度。不过,什么是sourcemap,官方用提供了许多种的sourcemap,其中的区别是什么,我们在开发中应该怎么选择,都是我们要学习的。1.什么是sourcemap现在的前端代码会通过babel编译或者各类的…

    2022年9月29日
    0
  • 详细BP神经网络预测算法及实现过程实例「建议收藏」

    1.具体应用实例。根据表2,预测序号15的跳高成绩。表2国内男子跳高运动员各项素质指标 序号 跳高成绩() 30行进跑(s) 立定三级跳远() 助跑摸高() 助跑4—6步跳高() 负重深蹲杠铃() 杠铃半蹲系数 …

    2022年4月7日
    406

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号