基准结果ForkJoin vs Disruptor?

Bio*_*441 4 jmh

我已经运行了这个DisruptovsFJ Mirco-Benchmarks Aleskey Shipilev,其中ForkJoin和Disruptor库的性能进行了比较.

我在Linux平台i5上使用JDK1.8.40的结果:

Benchmark                     Score,     Score Error (99.9%),Unit,Param: slicesK,

Disruptor.run,              939.801405,   20.741961,ms/op,   50000,0,10
ForkJoin.run,               1175.263451,  0.595711, ms/op,   50000,0,10
ForkJoinRecursive.run       771.854028,   26.022542,ms/op,   50000,0,10
ForkJoinRecursiveDeep.run,  1356.697011,  28.666325,ms/op,   50000,0,10
ForkJoinReuse.run,          7974.180793,  49.604539,ms/op,   50000,0,10 
Run Code Online (Sandbox Code Playgroud)

slicesK < 50000预期结果的第一部分Disruptor是使用RingBuffer和一种使其在并发上下文中高效的机制.

现在,当slicesK >= 50000Disruptor测试比ForkJoinRecursiveDeep,并ForkJoinReuse少高性能.有人可以向我解释那些结果吗?谢谢

int*_*ika 5

答案:

您的Disruptor可用环形缓冲区在sliceK> = 50000处以某种方式填满,这会导致性能下降.

备注:

对于非常高的性能,环形缓冲区及其内容应该适合L3 CPU高速缓存,以便在线程之间进行交换.如果环形缓冲区用于重放场景,例如市场数据或网络恢复,则它可能更大并且具有来自缓存未命中的明显性能影响.


缓冲


Sequencer的一个角色是确保发布不包装Ring Buffer.要做到这一点,下游消费者中没有一个可能具有低于环形缓冲区序列的序列,而不是环形缓冲区的大小.但是,使用依赖关系图可以进行有趣的优化 具有一组依赖消费者的干扰者.


在此输入图像描述

------------------- ^线程1 ^ --------------------------- --------------------------------- ^线程2 ^ ----------


在此输入图像描述


链接:

解析干扰器:环形缓冲器有什么特别之处?

Disruptor常见问题解答

LMAX架构

LMAX Disruptor Info页面

Wiki:循环缓冲区(Disruptor不使用指针)

其他循环缓冲区维基