构建哈希集,单线程还是多线程的快速方法?

时间:2014-03-19 17:44:14

标签: c# multithreading hash hashset

我想知道为什么构建一个hashset的速度更快。

我的过程是这样的:

1,数据库访问(单线程),获取 ID列表。

2,
计划A

foreach( var oneID in IDs)
{
    myHashSet.add(oneID);
}

计划B

Parallel.ForEach(IDs,myPallOpt,(oneID)=>
{
    myHashSet.add(oneID);
});

那么哪个更快的计划A还是B?

由于

2 个答案:

答案 0 :(得分:2)

HashSet<T>不是线程安全的,因此第二个选项(使用Parallel.ForEach)可能会导致错误。绝对应该避免。

最好的选择可能就是直接从结果中构建hashset:

var myHashSet = new HashSet<int>(IDs);

请注意,这仅适用于HashSet仅用于包含此集合中的项目的情况。如果您要添加到现有HashSet<T>foreach(您的第一个选项)可能是最佳选择。

答案 1 :(得分:0)

Plan B可能不会工作,因为它可能不是线程安全的(大多数.NET集合类都不是线程安全的)。您可以通过对线程安全的访问来修复它,但这实际上意味着序列化对它的访问,这并不比单线程更好。唯一有意义的情况是,如果在for循环开始和实际添加之间有一些cpu密集型处理,那么并行化很好。