HashSet <T>如何.包含比List <T> .Contains更快?

Mui*_*uis 4 .net performance contains list hashset

我有一个简单的要求:我有数百万字符串,并想测试它们是否存在于一个小集合中.我对使用List<T>vs a HashSet<T>这个集合感到怀疑.

例如,当需求相反时,你有100个字符串,需要检查它们是否存在于数百万个字符串中,我完全理解这HashSet<T>是最好的选择.

但对我来说,似乎.NET有来计算哈希值百万(调用的GetHashCode)时调用ContainsHashSet<T>,所以调用ContainsList<T>可能会更快?

谁能解释这个假设是否正确?

Jon*_*eet 11

这些似乎都不适合我 - HashSet<string>听起来这对我来说可能是最好的方法.

是的,.NET必须为每个字符串计算哈希码 - 问题在于,只要检查候选集中数百个字符串中的每个字符串是否相等就需要.

根据所有性能问题,你应该测试这个而不是猜测.例如,如果所有字符串都有不同的长度并且它们都很长,那么Equals对每个候选人来说都是便宜的,并且GetHashCode可能需要很长时间.但是,如果你的所有字符串都是以相同的6个字符开头的长度为10,那么GetHashCode它将相当便宜,但每个字符串相等性检查都必须检查所有这些公共前缀字符.哪一个更像你的实际情况?您的基准显示了什么?你需要多快这个?

  • @Joshua:我问过几次-您检查了目前的表现吗?您的基准测试怎么说?如果您还没有*获得*基准测试,那么它肯定*还为时过早。决不要没有证据就进行优化。 (2认同)