高级程序员必会–JMH基准测试

DBC 1.3K 0

一、认识基准测试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>
  • 基准测试JMH helloWorld编写

    • 类似于mybatis-generator的配置方式

    • 第一步配置pom依赖

    • 第二步复制工具类

    • @Benchmark方法所注释的类为我们所要进行测试的类

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基准测试插图

温馨提示

可以看得到,StringBuild比String执行效率上来是要好一些的!

三、没有加入缓存之前集成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());
    }




}

高级程序员必会–JMH基准测试插图2

温馨提示

这里也可以去druid可视化界面看
高级程序员必会–JMH基准测试插图4

发表评论 取消回复
表情 图片 链接 代码

分享