В одном из моих приложений я должен использовать множество диктонар с пользовательскими объектами в качестве ключей. Чтобы повысить производительность поисков, я реализую базовый класс, который переопределяет 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 ().
Edit:
Я провел некоторое тестирование производительности с помощью профилировщика Equatec и простого консольного приложения.
Программа класса
{
статическое чтение только в циклах = 50000;
статический словарь objectsDict = new 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 мс
- ObjectHash 7 мс
Очевидно, что по умолчанию GetHashCode является лучшим выбором.