一、认识基准测试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,转载请注明。

