当前位置:   article > 正文

JMH基准测试 & Disruptor单机最快MQ_jmhmq

jmhmq

一、JMH:Java Microbenchmark Harness(java微基准测试)

实操步骤

  1. 新建Maven项目,导入JMH依赖jmh-core / jmh-generator-annprocess
  2. 编写测试类以及要测试的方法
  3. 在test包下新建测试类
  4. 写一个测试方法,导入要测试的方法并加上注解
  5. 运行测试方法得到测试报告
public class JMHTestDemo {

    @Benchmark
    /** 预热,让JVM完成即时编译优化 */
    @Warmup(iterations = 1, time = 3)
    /** 调用多少个线程执行程序 */
    @Fork(5)
    /** 测试模式,Throughput吞吐量模式,程序每秒能执行多少次 */
    @BenchmarkMode(Mode.Throughput)
    /** 调用多少次该方法测试 */
    @Measurement(iterations = 1, time = 3)
    public void testJMH(){
        /** 需要测试的方法 */
        JMHTest.PrimeTest();
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

测试报告===》

Benchmark             Mode  Cnt  Score   Error  Units
JMHTestDemo.testJMH  thrpt    5  0.638 ± 0.074  ops/s


  • 1
  • 2
  • 3
  • 4

二、Disruptor

  • 无锁高并发的环形buffer消息队列,用于生产者消费者模式;

  • 首尾相连的ConcurrentArrayQueue,用数组实现,为了使用位运算数组容量为2的幂次方,插入删除或者取元素时都是对数组长度求mod运算(位运算12%8 = 12&(8-1))得到数组下标,这样比使用双向链表快,而且只需要维护一个指针,比链表的首位指针少一个;

  • 单机速度最快的MQ;

  • 性能极高,全是用的无锁CAS;

  • 内存高效队列,不支持持久化;

  • 八种等待策略:当生产者线程太多,消费者来不及消费时,会采用等待策略阻止生产者继续往队列里放元素,防止环形覆盖(阻塞、自旋、睡眠一段时间等)

  • 三大组成部分:1) 消息Event(环形队列指向的对象);2) 消息工厂EventFactory:生产消息的工厂;3) 消费者EventHandler(具体定义怎么消费消息)

  • 为了提高性能,会使用一个消息工厂,在new了一个disruptor之后会在环形数组中事先放好一个消息的初始对象,当生产者要往队列中放入一个消息时,直接在原有的初始消息对象上修改就行,不需要再经过new对象的过程,减少了GC频率;

  • 生产者有Multi和Single两个模式,当只有一个生产者时使用Single模式可以进一步提高效率;多线程模式的话加了锁会降低效率;

  • 异常处理:当消费者消费时出现异常可以使用自定义的异常处理方法;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/255043
推荐阅读
相关标签
  

闽ICP备14008679号