开发小工具-JMH基准测试
我们在写代码的时候经常有这种怀疑:写法A快还是写法B快?哪个写法性能更好,效率更高。
在开发过程中常常需要对方法性能做测定,JMH是一个轻量级压测框架,适合开发简单做方法性能的测试。
JMH和jMeter的使用场景还是有很大的不同的,jMeter更多的是对rest api进行压测,而JMH关注的粒度更细,它更多的是发现某块性能槽点代码,然后对优化方案进行基准测试对比。
注意:JMH适合细粒度的方法测试,并不适用于系统之间的链路测试!
越复杂,结果越不可靠(more complex and the results are less reliable)
但是,简单的方法性能测试岂不好用。所以我的定位是,轻量级的方法性能测试工具。
目录
一、JMH基准测试介绍
1、什么是 JMH
JMH 是 Java Microbenchmark Harness 的缩写。中文意思大致是 “JAVA 微基准测试套件”。
首先先明白什么是“基准测试”。
百度百科给的定义如下:
基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。
可以简单的类比成我们电脑常用的鲁大师,或者手机常用的跑分软件安兔兔之类的性能检测软件。都是按一定的基准或者在特定条件下去测试某一对象的的性能,比如显卡、IO、CPU之类的。
2、为什么要使用 JMH
基准测试的特质有如下几种:
①、可重复性:可进行重复性的测试,这样做有利于比较每次的测试结果,得到性能结果的长期变化趋势,为系统调优和上线前的容量规划做参考。
②、可观测性:通过全方位的监控(包括测试开始到结束,执行机、服务器、数据库),及时了解和分析测试过程发生了什么。
③、可展示性:相关人员可以直观明了的了解测试结果(web界面、仪表盘、折线图树状图等形式)。
④、真实性:测试的结果反映了客户体验到的真实的情况(真实准确的业务场景+与生产一致的配置+合理正确的测试方法)。
⑤、可执行性:相关人员可以快速的进行测试验证修改调优(可定位可分析)。
可见要做一次符合特质的基准测试,是很繁琐也很困难的。外界因素很容易影响到最终的测试结果。特别对于 JAVA的基准测试。
我觉得,主要还是比较轻量级,开发方便使用,maven引入,添加注解,测试执行结果了然。
二、入门demo使用
1、maven引用
jdk9以上自带
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.19</version>
</dependency>
2、测试demo示例
(1)测试类注解
@State(Scope.Benchmark)
(2)方法注解
@Benchmark
(3)编写执行main
/**
* 用来做简单的基准测试JMH--班级查询慢20200107
*
* @param args
*/
public static void main(String[] args) throws RunnerException {
/*
关键参数分析
1 warmupIterations(10) 的意思是预热做10轮,
2 measurementIterations(10) 代表正式计量测试做10轮,⽽每次都是先执⾏完预热再执⾏
正式计量,内容都是调⽤标注了 @Benchmark 的代码
3 forks(3) 指的是做3轮测试,因为⼀次测试⽆法有效的代表结果,所以通过3轮测试较为全
⾯的测试,⽽每⼀轮都是先预热,再正式计量
*/
Options options = new OptionsBuilder().include(ApiTestController.class.getSimpleName()).warmupBatchSize(10).measurementIterations(10).forks(3).build();
new Runner(options).run();
}
3、执行结果
参考
Java 并发测试神器:基准测试神器-JMH