赞
踩
实操步骤
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
无锁高并发的环形buffer消息队列,用于生产者消费者模式;
首尾相连的ConcurrentArrayQueue,用数组实现,为了使用位运算数组容量为2的幂次方,插入删除或者取元素时都是对数组长度求mod运算(位运算12%8 = 12&(8-1))得到数组下标,这样比使用双向链表快,而且只需要维护一个指针,比链表的首位指针少一个;
单机速度最快的MQ;
性能极高,全是用的无锁CAS;
内存高效队列,不支持持久化;
八种等待策略:当生产者线程太多,消费者来不及消费时,会采用等待策略阻止生产者继续往队列里放元素,防止环形覆盖(阻塞、自旋、睡眠一段时间等)
三大组成部分:1) 消息Event(环形队列指向的对象);2) 消息工厂EventFactory:生产消息的工厂;3) 消费者EventHandler(具体定义怎么消费消息)
为了提高性能,会使用一个消息工厂,在new了一个disruptor之后会在环形数组中事先放好一个消息的初始对象,当生产者要往队列中放入一个消息时,直接在原有的初始消息对象上修改就行,不需要再经过new对象的过程,减少了GC频率;
生产者有Multi和Single两个模式,当只有一个生产者时使用Single模式可以进一步提高效率;多线程模式的话加了锁会降低效率;
异常处理:当消费者消费时出现异常可以使用自定义的异常处理方法;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。