JMH和Disruport
JMH -java Microbenchmark Harness
微基准测试,它是测的某一个方法的性能到底是好还是不好,换了方法的实现之后它的性能是好还是不好。
JMH的基本概念
-
Warmup
预热,由于JVM中对于特定代码会存在优化(本地优化),预热对于测试效果很重要
-
Mesurement
总共执行多少次
-
Timeout
-
Threads
线程数由fork指定
-
Benchmark mode
基准测试的模式
-
Benchmark
测试哪一段代码
Disruport
Disruport叫无锁、高并发、环形Buffer,直接覆盖(不用清除)旧的数据,降低GC频率,用于生产者消费者模式。Disruport简单理解就是内存里用于存放元素的一个高效率的队列。
Disruport核心和特点
Disruport也是一个队列,和其它队列不同的是它是一个环形队列,Disruport的核心是环形buffer。
RingBuffer是一个环形队列
RingBuffer的序号,指向下一个可用的元素
采用数组实现,没有首尾指针
对比ConcurrentLinkedQueue用数组实现的速度更快
Disruport开发步骤
-
定义Event-队列中需要处理的元素
在Disruport它是每一个消息都认为是一个事件,在它的概念里就是一个事件,所以在这个环形队列里面存的是一个一个的Event
-
第一Event工厂,用于填充队列
那这个Event怎么产生,就需要指定Event的工厂
-
定义EventHandler(消费者),处理容器中的元素
那这个Event怎么消费,就需要指定Event的消费者EventHandle
Disruport初始化的时候会调用Event工厂,对ringBuffer进行内存的提前分配,GC效率会变低我么生产者的时候默认会有好多种生产方式,默认的是多线程生产者,但是假如你确定你整个程序里头只有一个生产者的话那你还能提高效率,就是在你指定Disruport生产者的线程的方式是SINGLE,生产者的类型ProducerType。
ProducerType生产者线程模式
ProducerType有两种模式ProducerMULTI和Producer.SINGLE
默认是MULTI,表示多线程模式下生产sequence
如果确认是单线程生产者,那么可以指定SINGLE,效率会提升
等待策略
- BlockingWaitStrategy:通过线程堵塞的方式,等待生产者唤醒,被唤醒后,再循环检查依赖的sequence是否已经消费
- BusySpinWaitStrategy:线程一直自旋等待,可能比较耗CPU
- LiteBlockingWaitStrategy:线程阻塞等待生产者唤醒,与BlockingWaitStrategy相比,区别在signalNeeded.getAndSet,如果两个线程同时访问一个waitfor,一个访问signalAll时,可以减少lock加锁的次数
- LiteTimeoutBlockingWaitStrategy:与LiteBlockingWaitStrategy相比,设置了阻塞时间,超过时间后抛出异常
- PhasedBackoffWaitStrategy:根据时间参数和传入的等待策略来决定使用哪种等待策略
- TimeoutBlockingWaitStrategy:相对于BlockingWaitStrategy来说,设置了等待时间,超过后抛出异常