Я делаю поиск Dictionary<>
в цикле O (n ^ 2) и мне нужно, чтобы он был смехотворно быстрым.Это не.Кто-нибудь знает, как реализовано Dictionary<>
?Я тестирую производительность словаря с помощью изолированного тестового примера после запуска моего кода через профилировщик и определения, что поиск по словарю составляет основную часть процессорного времени. Мой тестовый код выглядит следующим образом:
Int32[] keys = new Int32[10] { 38784, 19294, 109574, 2450985, 5, 398, 98405, 12093, 909802, 38294394 };
Dictionary<Int32, MyData> map = new Dictionary<Int32, MyData>();
//Add a bunch of things to map
timer.Start();
Object item;
for (int i = 0; i < 1000000; i++)
{
for (int j = 0; j < keys.Length; j++)
{
bool isFound = map.ContainsKey(keys[j]);
if (isFound)
{
item = map[keys[j]];
}
}
}
timer.Stop();
ContainsKey и map[] - это две медленные части (одинаково медленные). Если я добавлю TryGetValue, он почти идентичен по скорости ContainsKey.Вот некоторые интересные факты ..
A Dictionary<Guid, T>
примерно вдвое медленнее, чем Dictionary<Int32, T>
.Dictionary<String, T>
примерно вдвое медленнее словаря Guid.A Dictionary<Byte, T>
на 50% быстрее, чем использование Ints.Это наводит меня на мысль, что Словарь выполняет O (log n) двоичный поиск, чтобы найти ключ, а операторы сравнения на ключах являются узким местом.По какой-то причине я не верю, что он реализован как Hashtable, потому что .NET уже имеет класс Hashtable, и, по моему опыту, он даже медленнее, чем Dictionary.
Доступ к создаваемым мной словарям доступен толькопо одному потоку за раз, поэтому блокировка чтения не является проблемой.ОЗУ тоже не проблема.В словаре, скорее всего, будет только около 10 сегментов, но каждый блок может указывать на одну из около 2000 возможных вещей.У кого-нибудь есть отзывы о том, как сделать это быстрее?Спасибо!
Майк