栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

实操步骤

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

    @Benchmark
    
    @Warmup(iterations = 1, time = 3)
    
    @Fork(5)
    
    @BenchmarkMode(Mode.Throughput)
    
    @Measurement(iterations = 1, time = 3)
    public void testJMH(){
        
        JMHTest.PrimeTest();
    }
}

测试报告===》

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


二、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模式可以进一步提高效率;多线程模式的话加了锁会降低效率;

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/343307.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号