не Может жить без него!:)
Скорее всего, вы видите JIT-компиляцию. На своем ящике я вижу:
00:00:00.0000360
00:00:00.0000060
, когда я запускаю его два раза подряд в одном и том же процессе - а не в отладчике. (Убедитесь, что вы не запускаете его в отладчике, иначе это бессмысленный тест.)
Теперь измерять любое время , что tiny, как правило, плохая идея. Вам нужно будет повторить миллионы раз, чтобы лучше понять, сколько времени это займет.
Есть ли у вас веские основания полагать, что это на самом деле замедляет ваш код - или вы все основываете на ваше исходное время?
Я сомневаюсь, что вы найдете что-нибудь значительно быстрее, чем Dictionary
, и я был бы очень удивлен, обнаружив, что это узкое место.
EDIT: I ' Мы только что протестировали добавление миллиона элементов в Dictionary
, где все ключи были существующими объектами (строками в массиве), повторно используя одно и то же значение (поскольку оно не имеет значения) и указав емкость миллионов на строительство - и это заняло около 0,15 секунды на моем ноутбуке двухлетней давности.
Это действительно , вероятно, будет узким местом для вас, учитывая, что вы уже сказали, что используете какие-нибудь "старые медленные библиотеки" где-нибудь в вашем приложении? Имейте в виду, что чем медленнее работают эти другие библиотеки, тем меньшее влияние будет иметь улучшенный класс коллекции. Если изменения словаря составляют только 1% от общего времени вашего приложения, то даже если бы мы могли предоставить мгновенный словарь, вы бы ускорили свое приложение только на 1%.
Как всегда, получить профилировщик - это '
Я согласен с предположением Джона Скита , что это, скорее всего, JIT-компиляция.
При этом я хотел добавить сюда некоторую другую информацию:
] Большинство проблем со скоростью, связанных с использованием Dictionary
, не связаны с реализацией Dictionary. Dictionary
ОЧЕНЬ быстро работает прямо из коробки. Было бы трудно превзойти его.
Проблемы со скоростью, связанные с экземплярами Dictionary, почти всегда на самом деле являются проблемами реализации хэш-кода. Если у вас возникают проблемы со скоростью при использовании Dictionary
, вернитесь к реализации GetHashCode ()
, которую вы определили в MyCustomClass. Это еще более важно, если вы используете настраиваемую структуру в качестве ключа.
Чтобы получить хорошую производительность от Dictionary, GetHashCode ()
должен быть:
Если вы все правильно поняли, я думаю, вы будете очень довольны реализацией словаря по умолчанию.
Не забывайте, что вы также синхронизируете конструктор словаря в этом коде. Я провел тест, переместив вызов конструктора из измерения, и зациклился 10 раз. Вот мой тестовый код:
for (int i = 0; i < 10; i++)
{
Dictionary<string, string> test = new Dictionary<string, string>();
System.Diagnostics.Stopwatch watch = System.Diagnostics.Stopwatch.StartNew();
test.Add("fieldName", "fieldValue");
test.Add("Title", "fieldavlkajlkdjflkjalkjslkdjfiajwelkrjelrkjavoijl");
Console.WriteLine(watch.Elapsed);
}
Console.ReadKey();
Ниже приведены результаты:
00:00:00.0000607
00:00:00.0000025
00:00:00.0000015
00:00:00.0000015
00:00:00.0000016
00:00:00.0000017
00:00:00.0000016
00:00:00.0000016
00:00:00.0000016
00:00:00.0000015
Я не уверен, насколько быстрее вы можете это сделать ...
Обновление
Похоже, это также отражает результаты Джона Скитса ... JIT.
Если вам действительно нужна более высокая производительность, вам придется отказаться от чего-то важного - например, универсальных шаблонов, динамического распределения памяти и т. Д. Все эти функции приносят в жертву некоторую производительность.
Я бы хотел избегайте использования Contains, если это возможно, и посмотрите TryGetValue и т. д.
Скорее всего, вы не найдете ничего быстрее, чем Словарь. Я бы просто использовал словарь. Затем, когда вы видите, что не достигли своих целей по производительности, а профилировщик указывает, что добавление / удаление из словаря является узким местом, которое вы можете заменить на более целевой класс.
Обратите внимание, что такие функции, как LINQ, не влияют на производительность убыток, если вы ими не воспользуетесь.
Не могли бы вы использовать список и определить перечисление, например, fieldName = 0, Title = 1 и использовать уникальный индекс каждого свойства в качестве индекса поиска в списке? Это будет самое быстрое решение, хотя и наименее гибкое, поскольку вы будете привязаны к перечислению.
Сколько элементов вы планируете добавить в словарь? Хотя Dictionary / Hashtable обычно самый быстрый, в зависимости от того, что вы делаете, может быть что-то более быстрое (также более подходящее), чем Hashtable (основная структура в Dictionary). В зависимости от использования, возможно, что SortedList может быть быстрее, если объединить его с каким-то списком пропуска или даже самобалансирующимся деревом или попытками. Особенно, если вы хотите вернуть диапазон значений, а не одно значение.
Хеш-таблица хорошо подходит, когда:
Если вы выполняете некоторое сжатие, например, RB-Tree лучше, чем Hashtable.
] Источник: http://en.wikipedia.org/wiki/Hashtable#Dynamic_resizing