我想知道为什么构建一个hashset的速度更快。
我的过程是这样的:
1,数据库访问(单线程),获取大 ID列表。
2,
计划A
foreach( var oneID in IDs)
{
myHashSet.add(oneID);
}
计划B
Parallel.ForEach(IDs,myPallOpt,(oneID)=>
{
myHashSet.add(oneID);
});
那么哪个更快的计划A还是B?
由于
答案 0 :(得分:2)
HashSet<T>
不是线程安全的,因此第二个选项(使用Parallel.ForEach
)可能会导致错误。绝对应该避免。
最好的选择可能就是直接从结果中构建hashset:
var myHashSet = new HashSet<int>(IDs);
请注意,这仅适用于HashSet
仅用于包含此集合中的项目的情况。如果您要添加到现有HashSet<T>
,foreach
(您的第一个选项)可能是最佳选择。
答案 1 :(得分:0)
Plan B可能不会工作,因为它可能不是线程安全的(大多数.NET集合类都不是线程安全的)。您可以通过对线程安全的访问来修复它,但这实际上意味着序列化对它的访问,这并不比单线程更好。唯一有意义的情况是,如果在for循环开始和实际添加之间有一些cpu密集型处理,那么并行化很好。