什么是JMH(微基准测试)
JMH,全称Java Microbenchmark Harness (微基准测试框架),是专门用于Java代码微基准测试的一套测试工具API,是由Java虚拟机团队开发的的,一般用于代码的性能调优。
基准测试BenchMark
BenchMark又叫做基准测试,主要用来测试一些方法的性能,可以根据不同的参数以不同的单位进行计算(例如可以使用吞吐量为单位,也可以使用平均时间作为单位,在 BenchmarkMode 里面进行调整)。
微基准测试MicroBenchmark
MicroBenchmark就是在method层面上的benchmark,精度可以精确到微秒级、甚至可以达到纳秒级别,适用于 java 以及其他基于 JVM 的语言。与Apache JMeter 不同,JMH 测试的对象可以是任一方法,颗粒度更小,而不仅限于接口以及API层面。
JMH比较典型的应用场景如下:
- 想要知道某个函数需要执行多长时间,以及执行时间和输入之间的相关性
- 想要对比接口不同实现在给定条件下的吞吐量大小
- 想要知道百分之N的请求在多长时间内完成
- 想要找出了热点函数,需要对热点函数进行进一步优化时
- 针对于函数的多种实现方式(例如JSON序列化/反序列化有Jackson和Gson实现),不知道哪种实现性能更好
JMH的开发准备
JMH的使用可以参考官方示例。
JMH的Maven依赖
在maven的配置文件中增加如下依赖,最新的依赖版本可以参考:
- mvnrepository.com/artifact/org.openjdk.jmh/jmh-core
- mvnrepository.com/artifact/org.openjdk.jmh/jmh-generator-annprocess
pom.xml 添加依赖
<!-- JMH的核心包 https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-core -->
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.35</version>
</dependency>
<!-- JMH依赖注解,需要注解处理包 https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-generator-annprocess -->
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.35</versio