基准测试结果 ForkJoin vs Disruptor?
Benchmark results ForkJoin vs Disruptor?
我有 运行 这个 DisruptovsFJ 由 Aleskey 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。
有人可以向我解释这些结果吗?谢谢
答案:
您的 Disruptor 可用环形缓冲区在 slicesK >= 50000 时不知何故已满,这导致性能下降。
备注:
为了获得非常高的性能,环形缓冲区及其内容应该适合 L3 CPU 缓存,以便在线程之间进行交换。如果环形缓冲区用于重放场景,例如市场数据或网络恢复,它可能更大并且缓存未命中对性能有明显影响。
Sequencer 的角色之一是确保发布不会包装 Ring Buffer。要做到这一点,下游消费者的 none 可能有一个序列,该序列低于环形缓冲区的序列,小于环形缓冲区的大小。然而,使用依赖关系图可以进行有趣的优化
-------------------- ^ 线程 1 ^ ---------------------- -------------------------------------- ^ 线程 2 ^ ------ --
友情链接:
Dissecting the Disruptor : What's so special about a ring buffer ?
Wiki : Circular buffer(Disruptor 不使用指针)
我有 运行 这个 DisruptovsFJ 由 Aleskey 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。
有人可以向我解释这些结果吗?谢谢
答案:
您的 Disruptor 可用环形缓冲区在 slicesK >= 50000 时不知何故已满,这导致性能下降。
备注:
为了获得非常高的性能,环形缓冲区及其内容应该适合 L3 CPU 缓存,以便在线程之间进行交换。如果环形缓冲区用于重放场景,例如市场数据或网络恢复,它可能更大并且缓存未命中对性能有明显影响。
Sequencer 的角色之一是确保发布不会包装 Ring Buffer。要做到这一点,下游消费者的 none 可能有一个序列,该序列低于环形缓冲区的序列,小于环形缓冲区的大小。然而,使用依赖关系图可以进行有趣的优化
-------------------- ^ 线程 1 ^ ---------------------- -------------------------------------- ^ 线程 2 ^ ------ --
友情链接:
Dissecting the Disruptor : What's so special about a ring buffer ?
Wiki : Circular buffer(Disruptor 不使用指针)