晚安,
我试图在C#中对HashSet和List数据类型的性能进行基准测试,以检查在需要进行大量插入/删除时哪一个表现最佳。我使用的代码大致如下。
public static Func<String, HashSet<String>> ListaPossiveisCorreccoes = StrPalavra => {
(...)
HashSet<String> ListaCorreccoes = new HashSet<String> ();
(...)
(Lots of .Add operations)
return ListaCorreccoes;
};
public static Func<String, IEnumerable<String>> ListaCorreccoes = (StrPalavra) =>
{
HashSet<String> ConjuntoCorreccoes = new HashSet<String> ( );
foreach (String StrTmp in ListaPossiveisCorreccoes(StrPalavra))
foreach (String StrTmp2 in ListaPossiveisCorreccoes(StrTmp))
ConjuntoCorreccoes.Add(StrTmp2);
return ConjuntoCorreccoes/*.Distinct()*/.Where(PalavraConhecida)*/;
};
当我运行sequentaly时,上面列出的两个函数需要大约250-285ms来完成(我正在使用memoization)。但是,如果我将HashSet<String>
替换为List<String>
,并取消注释最后一行的注释部分(从而强制从列表中删除重复项),则只需140-145毫秒即可完成。这与我读到的关于HashSets的内容相矛盾,HashSets表示它们的性能比添加/删除操作中的列表要好得多。有人可以告诉我这是否正常? 250ms当然不是很多,但它几乎是列表所用时间的两倍,这很重要,因为这些函数是为了重复调用。
非常感谢。
答案 0 :(得分:2)
从问题
这与我读到的内容相矛盾 HashSets,说他们的 性能要好得多 添加 /删除中的列表 操作
我不确定您在哪里阅读HashSet<T>
与Lis<T>
相比,相对于Add,性能更快。这完全是错的。
List<T>.Add
特别优于HashSet<T>.Add
。在大多数情况下,Add List<T>
只是对数组索引的赋值和索引的增量。对HashSet<T>
来说要复杂得多。
删除更复杂,并且很大程度上取决于元素是否从集合的begininig,end或middle中删除。
答案 1 :(得分:0)
这不是我的,但确实有一些有趣的信息。
http://www.phase9studios.com/post/2008/01/08/DictionaryVSHashTable.aspx
我一直认为散列表更适合查找值。您可以在查找中获得性能提升,而不是插入。