23

我必须实现一个消费者一个生产者的标准算法。我可以很容易地使用Queue和几个lock语句来实现它。或者我可以只使用ConcurrentQueue. 什么是更好的?

如果Queue + lock使用,那么我可以优化“多次添加/检索”,因为我可以lock一次又一次地Add多次。

在一般情况下什么更快 -ConcurrentQueue或者Queue + lock差异有多大?当然ConcurrentQueue是最直接的方式,但我不想失去很多性能,因为我在 HFT 交易应用程序中使用它。

4

2 回答 2

26

简而言之,来自C#

并发堆栈、队列和包类在内部使用链表实现。这使得它们的内存效率低于非并发StackQueue类,但更适合并发访问,因为链表有助于无锁或低锁实现。

换句话说,很难定义一个一般情况,更不用说预测性能的差异是什么了。

这取决于集合的大小和使用情况。如果有足够的并发访问,可以预期性能会更好,内存消耗会更糟。

于 2013-01-01T15:01:58.373 回答
0

此外,来自有关 ConcurrentQueue(T) 与 Queue(T) 的 Microsoft 文档

在纯生产者-消费者场景中,每个元素的处理时间非常短(几条指令),然后 System.Collections.Concurrent.ConcurrentQueue 可以提供比具有外部锁的 System.Collections.Generic.Queue 适度的性能优势. 在这种情况下,当一个专用线程在排队并且一个专用线程在出队时,ConcurrentQueue 的性能最好。如果您不强制执行此规则,那么在具有多个内核的计算机上,Queue 甚至可能比 ConcurrentQueue 执行得稍快。

当处理时间约为 500 FLOPS(浮点运算)或更多时,则双线程规则不适用于 ConcurrentQueue,因此具有很好的可扩展性。在这种情况下,队列不能很好地扩展。

在生产者-消费者混合场景中,当处理时间非常短时,具有外部锁的队列比 ConcurrentQueue 具有更好的扩展性。但是,当处理时间约为 500 FLOPS 或更多时,ConcurrentQueue 的扩展性更好。

于 2022-01-22T17:39:03.727 回答