导航菜单
路很长,又很短
博主信息
昵   称:Cocodroid ->关于我
Q     Q:2531075716
博文数:305
阅读量:707484
访问量:66811
至今:
×
云标签 标签球>>
云标签 - Su的技术博客
博文->>首页 博主的更多博文>>
高性能工具:JMH 微基准测试
Tags : 高性能,工具,JMH,微基准测试发表时间: 2018-12-05 22:57:35
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。
比如: 转自:Su的技术博客  原文地址:
一、简介 

    JMH (Java Microbenchmark Harness)是一个用于构建、运行和分析用Java和其他针对JVM的语言编写的nano/micro/milli/macro基准测试的Java工具。OpenJDK提供的基准测试工具,是由Oracle实现JIT的相同人员开发的。

    在开发过程中,为了确定一个方法的性能,很多时候都是写一个循环多次调用方法通过计算时间来查看性能是否达到预期。但这种简单的方式得出的结论往往是不准确的。现代JVM不断优化,随着代码执行次数的增加,JVM会对其进行编译优化(JIT),最终结果与简单测试得出的结果可能差距很大。此外,测试往往需要做很多额外工作,比如:控制读写线程比例,控制线程同时启动,设置多线程测试中的状态对象,统计测试结果等等,自己实现这些功能既繁琐又不能完全保证正确。而JMH就是恰好能满足上述性能测试需求的工具。

    在代码进行微基准测试时必备的工具利器,在大部分优秀的框架(Netty等)都能看到针对代码性能的测试例子。或者你写了几种代码方案,但是不确定哪种方式是性能最优的,这时你可以使用JMH进行压测,就能知道哪种方案是最优的了。所以,了解和学习JMH对你是有一定的帮助的。

    

二、JMH常用的场景:

    1、想准确的知道某个方法需要执行多长时间,以及执行时间和输入之间的相关性;

    2、对比接口不同实现在给定条件下的吞吐量;

    3、查看多少百分比的请求在多长时间内完成。

    等等。


三、使用

    目前,最新的版本是1.21。推荐使用maven的方式导入相关的依赖包:


Demo:



   结果:





预热迭代3次,度量测试迭代5次,进行100次字符串的拼接操作。

从上面的测试结果来看,跟我们之前学习String、StringBuilder、StringBuffer对字符串的拼接操作,预测的性能结果很吻合:(吞吐量)StringBuilder(728) > StringBuffer(558) > String(272)。所以,你知道JMH的作用和威力了吧?


四、常用注解

    1、@Benchmark 

        标记要测试的方法。


    2、@BenchmarkMode

        设置测试模式,Mode.Throughput:吞吐量模式,一个时间单位内操作数(即是本文上面的例子);Mode.AverageTime:平均执行时间模式;Mode.SampleTime:采样模式;Mode.SingleShotTime:单次操作模式;Model.All:包含上面的全部模式。


    3、@OutputTimeUnit

        输出结果的时间粒度,有秒、毫秒、微妙、纳秒等时间单位。


    4、@State

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

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

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


    5、@Fork

        设置进程数,以及JVM参数。


五、资料

     学习一手jmh资料还是要关注官网,官网给出的几十个例子都是非常不错的资料。

    JMH官网地址:

        http://openjdk.java.net/projects/code-tools/jmh/

    JMH官网38个例子

        http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/

    相信上面的资料文档都能给你很多帮助!

    


参考资料:

    https://blog.csdn.net/lxbjkben/article/details/79410740

    https://www.jianshu.com/p/d2517aaced40

    https://mp.weixin.qq.com/s/uIhbLSlZIPypy-rs5GZndg



打赏
打赏
关注公众号
公众号
类别:Java| 阅读(217)| 赞 (0)
评论
暂无评论!
发表评论
昵  称:

验证码:

内  容:

    同时赞一个 赞