实操步骤
- 新建Maven项目,导入JMH依赖jmh-core / jmh-generator-annprocess
- 编写测试类以及要测试的方法
- 在test包下新建测试类
- 写一个测试方法,导入要测试的方法并加上注解
- 运行测试方法得到测试报告
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模式可以进一步提高效率;多线程模式的话加了锁会降低效率;
-
异常处理:当消费者消费时出现异常可以使用自定义的异常处理方法;



