Dubbo笔记五:JMH基准测试与分析

Dubbo笔记五:JMH基准测试与分析

文章目录

      • Dubbo笔记五:JMH基准测试与分析
        • 优惠券功能逻辑图
        • 优惠券列表开发
        • JMH基准测试
        • JMH基准测试HelloWorld
        • SpringBoot整合JMH测试
        • JMH数字分析

优惠券功能逻辑图

Dubbo笔记五:JMH基准测试与分析_第1张图片

  1. 优惠券特点

1、对于用户==》读优惠券

2、对于运营人员==》写优惠券

读多,写少。

优惠券列表开发

  1. 数据库添加两个字段,end_time,优惠券生效结束时间。start_time,优惠券生效开始时间
  2. 添加静态变量。不要在代码中直接写0,1等状态。
  3. 用自动生成的mapper工具中的代码来判断时间。
public List<TCoupon> getCouponList(){
    TCouponExample example=new TCouponExample();
    example.createCriteria().andStatusEqualTo(Constant.USERFUL)
        .andStartTimeLessThan(new Date()).andEndTimeGreaterThan(new Date());
    return tCouponMapper.selectByExample(example);
}

JMH基准测试

  1. 什么是基准测试

1、由jdk提供的微基准测试的一套API工具。为多用户并发测试和综合场景测试等提供参考依据。专门用于进行代码的微基准测试,比较两段代码的性能。

  1. 可以数字比较同一个方法不同实现的性能效果,找到最佳方法。

  2. 需要引入Maven依赖,加入方法注解@BechMark执行所要被比较的方法。

  3. 使用场景

1、需要对某个热点函数进行进一步优化的时候。

2、想定量的知道某个函数需要执行多长时间,以及执行时间和输入n的相关性。

3、一个函数有两种不同的表现,例如Json的序列化、反序列化有jackson和Gson实现。不知道那种实现效率高

  1. list.contain===>set.contain==>布隆过滤器

JMH基准测试HelloWorld

  1. 引入依赖

<dependency>
    <groupId>org.openjdk.jmhgroupId>
    <artifactId>jmh-coreartifactId>
    <version>1.21version>
dependency>
<dependency>
    <groupId>org.openjdk.jmhgroupId>
    <artifactId>jmh-generator-annprocessartifactId>
    <version>1.21version>
    <scope>providedscope>
dependency>
  1. 写测试方法,构建JMH测试对象,这里对StringBuffer和字符串拼接进行测试
public class JMHHelloWorld {

    public static void main(String[] args) throws RunnerException {
        //分别是几轮热身,几轮测试,开启的线程数。构建,为什么预热,因为jvm在执行后会有一个优化,先优化一下。
        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(){
        StringBuffer b=new StringBuffer();
        for(int i=0;i<10;i++){
            b.append(i);
        }
        b.toString();
    }
}
  1. 测试结果
Benchmark                       Mode  Cnt         Score   Error  Units
JMHHelloWorld.testStringAdd    thrpt    2  10597472.466          ops/s
JMHHelloWorld.testStringBuild  thrpt    2  26798626.066          ops/s

SpringBoot整合JMH测试

  1. 参考文档

JMH参数文档

  1. 需要引入注解@Setup用于加载SpringBootApplication。获取其上下文,然后再获取其Bean。
@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初始化只会执行一次
    //获取要测试项目的上下文和Bean
    @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数字分析

  1. 出现缓慢的原因

1、是否存在远程调用,HTTP、RPC、Metics等

2、大量内存处理 例如:List.contain()需要大量遍历,set.contain()等

  1. 处理方向

Dubbo笔记五:JMH基准测试与分析_第2张图片

你可能感兴趣的:(Dubbo)