本文主要是介绍JMH基准测试 Disruptor单机最快MQ,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、JMH:Java Microbenchmark Harness(java微基准测试)
实操步骤
- 新建Maven项目,导入JMH依赖jmh-core / jmh-generator-annprocess
- 编写测试类以及要测试的方法
- 在test包下新建测试类
- 写一个测试方法,导入要测试的方法并加上注解
- 运行测试方法得到测试报告
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();}
}
测试报告===》
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模式可以进一步提高效率;多线程模式的话加了锁会降低效率;
-
异常处理:当消费者消费时出现异常可以使用自定义的异常处理方法;
这篇关于JMH基准测试 Disruptor单机最快MQ的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!