帮助C#.NET泛型集合的性能和优化

Joh*_*dol 2 .net c# generics performance dictionary

我正在尝试优化一块看起来像这样的.NET 2.0 C#代码:

Dictionary<myType, string> myDictionary = new Dictionary<myType, string>();
// some other stuff
// inside a loop check if key is there and if not add element
if(!myDictionary.ContainsKey(currentKey))
{
   myDictionary.Add(currentKey, "");
}
Run Code Online (Sandbox Code Playgroud)

看起来像编写这段代码的人已经使用了字典,即使不需要(只有密钥用于存储唯一值列表),因为比搜索的myType对象列表更快.这似乎显然是错误的,因为只有字典的关键,但我试图了解什么是解决它的最佳方法.

问题:

1)我似乎明白,即使只使用.NET 3.5 HashSet,我也会获得良好的性能提升.它是否正确?

2)在.NET 2.0中优化上述代码的最佳方法是什么?为什么?

编辑:这是我试图优化的现有代码,它循环遍历数十万个项目,并且每个项目都调用一个ContainsKey.有一个更好的方法(即使在.NET 2.0中)!:)

Jar*_*Par 10

我认为你需要将其分解为2个问题

Dictionary<myType,string>此方案的最佳可用类型

根据您的细分,HashSet<myType>显然是更好的选择,因为它的使用模式更准确地适合场景

转换Hashset<myType>会给我带来性能提升吗?

这是非常主观的,只有剖析器可以为您提供这个问题的答案.可能你会看到集合中每个元素的内存大小改进非常小.但就原始计算能力而言,我怀疑你会看到巨大的差异.只有剖析器可以告诉您是否有.

在您对代码进行与性能相关的更改之前,请记住黄金法则.

在剖析器准确告诉您代码的错误之前,请勿进行任何与性能相关的更改.

进行违反此规则的更改只是猜测.分析器是衡量性能修复成功的唯一方法.

  • +1,但最后一句应该是大胆的:) (2认同)