我在很多文献中都读到ConcurrentBag由于同步开销较少而速度更快。在内部为每个添加项目的线程,它创建一个单独的数据存储,因此它不必处理同步。如果我从中提取数据,它将从特定线程的数据存储中提取数据。如果不存在,它将从其他线程的队列中窃取。我不理解的部分是在大多数正常情况下它不会是拔出数据的相同线程并且窃取本质上比正常同步慢得多,那么怎么说它更快。
例如,如果我有一个生产者消费者模式,我不关心使用一些生产者线程向ConcurrentBag添加数据以及其他一些线程对其进行排序,那么我的性能会受到很大影响,因为它永远不会是同一个线程将数据作为生产者线程拉出来,但我看到了与应用程序相同的示例。我在这里错过了什么吗?
答案 0 :(得分:1)
比什么更快?当正常情况是单个线程添加和删除项目时,ConcurrentBag
具有最佳性能。如果你想要一个纯生产者/消费者,一个线程正在添加而另一个正在删除,那么你可能希望使用BlockingCollection和默认的ConcurrentQueue作为后备存储。