一、认识基准测试JMH
-
-
对业务模型中的重要业务做单独的测试,获取单用户运行时的各项性能指标,为多用户并发测试和综合场景测试等性能分析
-
-
JMH是什么?
-
JMH,即Java Microbenchmark Harness,这是专门用于进行代码的微基准测试的一套工具API,JMH 由 OpenJDK/Oracle 里面那群开发了 Java 编译器的大牛们所开发
-
-
JMH典型使用场景
-
已经找出了热点函数,而需要对热点函数进行进一步的优化时,就可以使用 JMH 对优化的效果进行定量的分析。
-
想定量地知道某个函数需要执行多长时间,以及执行时间和输入 n 的相关性
-
一个函数有两种不同实现(例如JSON序列化/反序列化有Jackson和Gson实现),不知道哪种实现性能更好
-
二、JMH基准测试HelloWorld
基准测试引入pom依赖
<dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-core</artifactId> <version>1.21</version> </dependency> <dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-generator-annprocess</artifactId> <version>1.21</version> <scope>provided</scope> </dependency>
-
-
类似于mybatis-generator的配置方式
-
第一步配置pom依赖
-
第二步复制工具类
-
-
import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.runner.Runner; import org.openjdk.jmh.runner.RunnerException; import org.openjdk.jmh.runner.options.Options; import org.openjdk.jmh.runner.options.OptionsBuilder; public class JMHHelloWorld { public static void main(String[] args) throws RunnerException { Options options = new OptionsBuilder() // 热身、预热 .warmupIterations(2) // 测几轮 .measurementIterations(2) // 几个线程 .forks(1).build(); new Runner(options).run(); } @Benchmark public void testStringAdd(){ String s = ""; for (int i = 0; i < 10; i++) { s +=i; } } @Benchmark public void testStringBuild(){ StringBuilder b = new StringBuilder(); for (int i = 0; i < 10; i++) { b.append(i); } b.toString(); } }
三、没有加入缓存之前集成JMH测试接口性能
import com.xdclass.couponapp.CouponAppApplication; import com.xdclass.couponapp.service.CouponService; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.runner.Runner; import org.openjdk.jmh.runner.RunnerException; import org.openjdk.jmh.runner.options.Options; import org.openjdk.jmh.runner.options.OptionsBuilder; import org.springframework.boot.SpringApplication; import org.springframework.context.ConfigurableApplicationContext; @State(Scope.Thread) public class JMHSpringbootTest { private ConfigurableApplicationContext context; private CouponService couponService; public static void main(String[] args) throws RunnerException { Options options = new OptionsBuilder().include(JMHSpringbootTest.class.getName() + ".*") .warmupIterations(2).measurementIterations(2) .forks(1).build(); new Runner(options).run(); } /** * setup初始化容器的时候只执行一次 */ @Setup(Level.Trial) public void init(){ String arg = ""; context = SpringApplication.run(CouponAppApplication.class,arg); couponService = context.getBean(CouponService.class); } /** * benchmark执行多次,此注解代表触发我们所要进行基准测试的方法 */ @Benchmark public void test(){ System.out.println(couponService.getCouponList()); } }
本文作者为DBC,转载请注明。