我运行了由Aleskey Shipilev
编写的DisruptovsFJ Mirco-Benchmarks,其中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时。
有人可以向我解释那些结果吗?谢谢
答案 0 :(得分:5)
您的Disruptor可用环形缓冲区在sliceK&gt; = 50000处以某种方式填满,这会导致性能下降。
注意:
对于非常高的性能,环形缓冲区及其内容应该适合L3 CPU缓存,以便在线程之间进行交换。如果环形缓冲区用于重放场景,例如市场数据或网络恢复,则它可能更大,并且具有来自缓存未命中的明显性能影响。
Sequencer的一个角色是确保发布不包装Ring Buffer。为此,下游消费者中没有一个可能具有低于环形缓冲区序列的序列,而不是环形缓冲区的大小。但是,使用依赖关系图可以进行有趣的优化
------------------- ^线程1 ^ ------------------------ ------------------------------------ ^线程2 ^ ----------
链接:
Dissecting the Disruptor : What's so special about a ring buffer ?
Wiki : Circular buffer(Disruptor不使用指针)