HashSet UnionWith()方法在C#中的性能问题

时间:2012-05-11 12:12:54

标签: c# performance list hashset

我有很多HashSet包含不同的索引异常。我根据输入数据将这些哈希集合成一个大的HashSet。出于测试目的,我还将HashSet移植到List类似物中。

  • HashSetList的唯一目的是从随机数生成中排除索引。

这就是我在List的案例中做的事情:

list2 = new List<int>();
for (int d = 0; d < list1.Count; d++)
{
  if (dicCat4[30].ContainsKey(list1[d]))
  {
    list2.AddRange(dicCat4[30][list1[d]]);
  }
}

rand = 2 * RandString.Next(0 / 2, (dicCat[30].Count) / 2);
while (list2.Contains(rand))
{
  rand = 2 * RandString.Next(0 / 2, (dicCat[30].Count) / 2);
}
// action with random

如您所见,所有异常(索引)都使用AddRange()合并到一个列表中。使用Contains()方法,我们检查随机数是否在列表中。

使用HashSet可以完成相同的操作:

excludehash = new HashSet<int>();

for (int d = 0; d < list1.Count; d++)
{
  if (dicCat4[30].ContainsKey(list1[d]))
  {
    excludehash.UnionWith(dicCat3[30][list1[d]]);
  }
}

rand = 2 * RandString.Next(0 / 2, (dicCat[30].Count) / 2);
while (excludehash.Contains(rand))
{
  rand = 2 * RandString.Next(0 / 2, (dicCat[30].Count) / 2);
}
// action with random

在这种情况下,我使用AddRange()方法来合并UnionWith()索引异常,而不是HashSet

奇怪的是,经过数千次迭代后,<{> List方法的总体性能更好!,但根据许多来源HashSet应该执行得更快。性能分析器显示最大的性能值是HashSet的UnionWith()方法。

我只是好奇 - 有什么方法可以让HashSet解决方案更快地执行?(我刚刚想到了一个简单的想法:作为替代方案,我可以使用{{1} }在每个单独的hashset上,因此跳过Contains(rand)方法)

P.S。从以下位置检索哈希集和列表:

UnionWith()

编辑:硬核迭代解决方案

static Dictionary<int, Dictionary<int, HashSet<int>>> dicCat3;
static Dictionary<int, Dictionary<int, List<int>>> dicCat4;

2 个答案:

答案 0 :(得分:1)

尝试使用SortedSet而不是HashSet。

答案 1 :(得分:0)

如果你想在编辑交换上获得一点性能,你可以使用if / else。 C#假定else子句更有可能,因此首先评估该树!你应该在那里刮几毫秒。但除此之外我无法看到真正的方法来拯救你!

如果你发布了我可以导入的解决方案,那么我很乐意玩一个游戏,看看我能做些什么,但我不会为了好玩而全部打字! ;)