【发布时间】:2010-08-08 07:55:05
【问题描述】:
在我的一个应用程序中,我必须使用许多带有自定义对象作为键的字典。为了提高查找的性能,我实现了一个覆盖 GetHashCode 的基类。 它似乎可以工作,但不知何故我仍然对它有一种不好的感觉,所以我决定发布我的代码,如果有任何提示或意见,我将不胜感激。 (天哪,我忘记了代码:D)
abstract class FastHashed
{
private static Dictionary<Type,ulong> _instanceCounters = new Dictionary<Type,ulong>();
private int hash;
protected FastHashed()
{
Type instanceType = this.GetType();
if(! _instanceCounters.ContainsKey(instanceType)) _instanceCounters.Add(instanceType,0);
this.hash = ((instanceType.ToString())+(_instanceCounters[instanceType]++.ToString())).GetHashCode();
}
public override int GetHashCode()
{
return hash;
}
}
编辑:如果你不需要,不要乱用散列。这个“解决方案”比默认的 GetHashCode() 更慢,更不可靠。
编辑: 我使用 Equatec 分析器和一个简单的控制台应用程序进行了一些性能测试。
类程序 { 静态只读 int 周期 = 50000; 静态字典 objectsDict = new Dictionary(); static Dictionary foosDict = new Dictionary();
static void Main(string[] args)
{
foo[] foos = new foo[cycles];
object[] objects = new object[cycles];
for (int i = 0; i < cycles; i++)
{
foos[i] = new foo();
objects[i] = new object();
foosDict.Add(foos[i], i);
objectsDict.Add(objects[i], i);
}
ObjectHash(objects);
FooHash(foos);
}
static void ObjectHash(Object[] objects)
{
int value;
for (int i = 0; i < cycles; i++)
{
value = objectsDict[objects[i]];
}
}
static void FooHash(foo[] foos)
{
int value;
for (int i = 0; i < cycles; i++)
{
value = foosDict[foos[i]];
}
}
class foo
{
private readonly int _hash;
public foo()
{
_hash = this.GetHashCode();
}
public override int GetHashCode()
{
return _hash;
}
}
}
结果: - FooHash 26 774 毫秒 - 对象哈希 7 毫秒
显然默认的 GetHashCode 是最好的选择。
【问题讨论】:
-
我个人不明白这段代码的意义。
标签: c# performance hash