4

我已经运行了这个由 编写的DisruptovsFJAleskey Shipilev 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 时。有人可以向我解释这些结果吗?谢谢

4

1 回答 1

5

回答 :

您的 Disruptor 可用环形缓冲区在 slicesK >= 50000 时已满,这会导致性能下降。

备注:

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


缓冲


Sequencer 的作用之一是确保发布不会包装 Ring Buffer。要做到这一点,下游消费者的序列都不能低于环缓冲区的序列减去环缓冲区的大小。然而,使用依赖关系图可以进行有趣的优化 具有一组依赖消费者的破坏者。


在此处输入图像描述

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


在此处输入图像描述


链接:

剖析 Disruptor:环形缓冲区有什么特别之处?

破坏者常见问题

LMAX 架构

LMAX Disruptor 信息页面

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

其他循环缓冲区维基

于 2015-06-14T05:45:43.207 回答