我已经运行了由Aleskey Shipilev编写的这个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 slicesK < 50000的第一部分结果是预期的,因为Disruptor使用的是一个RingBuffer和一种机制,使得它在并发上下文中效率更高。
现在,当slicesK >= 50000时,Disruptor测试的性能不如ForkJoinRecursiveDeep和ForkJoinReuse。有人能给我解释一下这些结果吗?谢谢
发布于 2015-06-14 05:45:43
答:
在slicesK >= 50000中,您的Disruptor可用环缓冲区不知何故已满,这会导致性能下降。
备注:
为了获得很高的性能,环缓冲区及其内容应该适合在L3 CPU缓存中进行线程间的交换。如果环形缓冲区用于重放场景(如市场数据或网络恢复),则可能会更大,并从缓存丢失中产生明显的性能影响。

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



链接:
解剖者:环形缓冲器有什么特别之处?
LMAX体系结构
Wiki :循环缓冲区 (Disruptor不使用指针)
其他循环缓冲wiki
https://stackoverflow.com/questions/30569897
复制相似问题