【发布时间】:2018-03-20 12:37:23
【问题描述】:
我正在使用 C++ 编写 HFT 应用程序,因此低延迟非常重要。我使用无锁队列实现。
我的系统中主要有2个生产者线程,Producer1和Producer2,还有1个消费者线程Consumer1。
Producer1 产生 EventA 和 EventB
Producer2 产生 EventA
我看到有两个选项:
选项 1 - MPSC 队列
Producer1 将 EventA 推送到 Q1
Producer1 将 EventB 推送到 Q1
Producer2 将 EventA 推送到 Q1
Consumer1 线程循环消费 Q1。
选项 2 - 多个 SPSC 队列和单个消费者
Producer1 将 EventA 推送到 Q1
Producer1 将 EventB 推送到 Q2
Producer2 将 EventA 推送到 Q3
Consumer1线程循环消费Q1、Q2、Q3。
希望清楚...
在性能方面,您认为哪个选项更好?
提前谢谢..
【问题讨论】:
-
没有一般性答案。您需要测试程序中的代表性用例、运行它的每组硬件等。即使性能存在差异,这些选项也可能导致事件以不同的顺序被消耗——这取决于消费者的行为会影响行为。
-
您可以在不使用任何原子操作的情况下实现 SPSC 队列(仅使用内存屏障)。所以 2 个 SPSC 队列(P1->C1 和 P2->C1)可能是一个简单/理想的解决方案。但是,P1 和 P2 的生产率是多少? EventA 和 EventB 的大小是多少?他们是汇集的吗?如果是,它们是从同一个池中汇集的吗?可能还有其他我忘记提及的问题(NUMA?)。最好对这两种方法进行测试和基准测试!
标签: c++ multithreading low-latency