【问题标题】:ConcurrentBag performanceConcurrentBag 性能
【发布时间】:2014-05-05 14:13:45
【问题描述】:

我在很多文献中读到 ConcurrentBag 速度更快,因为同步开销更少。在内部为每个添加项目的线程创建一个单独的数据存储,因此它不必处理同步。如果我从中提取数据,它将从该特定线程的数据存储中提取数据。如果不存在,它将从其他线程的队列中窃取。我不明白的部分是在大多数正常情况下,它不会是相同的线程提取数据和窃取本质上比正常同步慢得多,那怎么能说它更快。

例如,如果我有一个生产者消费者模式,我不关心一些生产者线程将数据添加到 ConcurrentBag 和一些其他线程将其出队,我的性能将受到显着影响,因为它永远不会是同一个线程拉数据作为生产者线程输出,但我看到与应用程序相同的示例。我在这里遗漏了什么吗?

【问题讨论】:

    标签: .net multithreading c#-4.0


    【解决方案1】:

    比什么更快? ConcurrentBag 在正常情况下是单线程添加和删除项目时性能最佳。如果您想要一个纯生产者/消费者,其中一个线程正在添加,另一个线程正在删除,那么您可能希望使用 BlockingCollection 和默认的 ConcurrentQueue 作为后备存储。

    【讨论】:

    • 比 BlockingCollection 或任何同步队列更快
    • @Rahul BlockingCollection 在您传递的任何IProducerConsumerCollection 之上工作(也可能是ConcurrentBag),所以这是一个不好的例子:) 无论如何,重点是仅当生产者和消费者可以在同一线程上运行时,节省才有效。这不包括大多数生产者/消费者场景,但如果可以在大多数情况下避免跨线程,这将非常有帮助。
    • @Luaan:我的意思是在ConcurrentBag 中“窃取”比从ConcurrentQueue 中出列项目更昂贵。所以如果你知道你的生产者和消费者在不同的线程上,那么你最好使用ConcurrentQueue。而且,是的,我知道BlockingCollection 使用你给它的任何IProducerConsumerCollection。这就是为什么我特别说“默认ConcurrentQueue”。
    • @JimMischel 是的,我一直在回复 Rahul 的评论,而不是你的 :)
    猜你喜欢
    • 1970-01-01
    • 2011-07-18
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2012-04-27
    • 1970-01-01
    • 2020-12-25
    相关资源
    最近更新 更多