Более быстрая замена к Словарю <TKey, TValue>

  • Ctrl-K, Ctrl-C для комментария блока текста с // в запуске
  • Ctrl-K Ctrl-U, чтобы не прокомментировать блок текста с // в запуске

не Может жить без него!:)

21
задан Alon Gubkin 8 December 2009 в 20:01
поделиться

7 ответов

Скорее всего, вы видите JIT-компиляцию. На своем ящике я вижу:

00:00:00.0000360
00:00:00.0000060

, когда я запускаю его два раза подряд в одном и том же процессе - а не в отладчике. (Убедитесь, что вы не запускаете его в отладчике, иначе это бессмысленный тест.)

Теперь измерять любое время , что tiny, как правило, плохая идея. Вам нужно будет повторить миллионы раз, чтобы лучше понять, сколько времени это займет.

Есть ли у вас веские основания полагать, что это на самом деле замедляет ваш код - или вы все основываете на ваше исходное время?

Я сомневаюсь, что вы найдете что-нибудь значительно быстрее, чем Dictionary , и я был бы очень удивлен, обнаружив, что это узкое место.

EDIT: I ' Мы только что протестировали добавление миллиона элементов в Dictionary , где все ключи были существующими объектами (строками в массиве), повторно используя одно и то же значение (поскольку оно не имеет значения) и указав емкость миллионов на строительство - и это заняло около 0,15 секунды на моем ноутбуке двухлетней давности.

Это действительно , вероятно, будет узким местом для вас, учитывая, что вы уже сказали, что используете какие-нибудь "старые медленные библиотеки" где-нибудь в вашем приложении? Имейте в виду, что чем медленнее работают эти другие библиотеки, тем меньшее влияние будет иметь улучшенный класс коллекции. Если изменения словаря составляют только 1% от общего времени вашего приложения, то даже если бы мы могли предоставить мгновенный словарь, вы бы ускорили свое приложение только на 1%.

Как всегда, получить профилировщик - это '

64
ответ дан 29 November 2019 в 06:07
поделиться

Я согласен с предположением Джона Скита , что это, скорее всего, JIT-компиляция.

При этом я хотел добавить сюда некоторую другую информацию:

] Большинство проблем со скоростью, связанных с использованием Dictionary , не связаны с реализацией Dictionary. Dictionary ОЧЕНЬ быстро работает прямо из коробки. Было бы трудно превзойти его.

Проблемы со скоростью, связанные с экземплярами Dictionary, почти всегда на самом деле являются проблемами реализации хэш-кода. Если у вас возникают проблемы со скоростью при использовании Dictionary , вернитесь к реализации GetHashCode () , которую вы определили в MyCustomClass. Это еще более важно, если вы используете настраиваемую структуру в качестве ключа.

Чтобы получить хорошую производительность от Dictionary, GetHashCode () должен быть:

  1. Fast
  2. Способен предоставлять хэш-коды, которые вызывают небольшое количество конфликтов. По возможности уникальные экземпляры должны генерировать уникальные хеш-значения.

Если вы все правильно поняли, я думаю, вы будете очень довольны реализацией словаря по умолчанию.

35
ответ дан 29 November 2019 в 06:07
поделиться

Не забывайте, что вы также синхронизируете конструктор словаря в этом коде. Я провел тест, переместив вызов конструктора из измерения, и зациклился 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.

7
ответ дан 29 November 2019 в 06:07
поделиться

Если вам действительно нужна более высокая производительность, вам придется отказаться от чего-то важного - например, универсальных шаблонов, динамического распределения памяти и т. Д. Все эти функции приносят в жертву некоторую производительность.

Я бы хотел избегайте использования Contains, если это возможно, и посмотрите TryGetValue и т. д.

5
ответ дан 29 November 2019 в 06:07
поделиться

Скорее всего, вы не найдете ничего быстрее, чем Словарь. Я бы просто использовал словарь. Затем, когда вы видите, что не достигли своих целей по производительности, а профилировщик указывает, что добавление / удаление из словаря является узким местом, которое вы можете заменить на более целевой класс.

Обратите внимание, что такие функции, как LINQ, не влияют на производительность убыток, если вы ими не воспользуетесь.

1
ответ дан 29 November 2019 в 06:07
поделиться

Не могли бы вы использовать список и определить перечисление, например, fieldName = 0, Title = 1 и использовать уникальный индекс каждого свойства в качестве индекса поиска в списке? Это будет самое быстрое решение, хотя и наименее гибкое, поскольку вы будете привязаны к перечислению.

1
ответ дан 29 November 2019 в 06:07
поделиться

Сколько элементов вы планируете добавить в словарь? Хотя Dictionary / Hashtable обычно самый быстрый, в зависимости от того, что вы делаете, может быть что-то более быстрое (также более подходящее), чем Hashtable (основная структура в Dictionary). В зависимости от использования, возможно, что SortedList может быть быстрее, если объединить его с каким-то списком пропуска или даже самобалансирующимся деревом или попытками. Особенно, если вы хотите вернуть диапазон значений, а не одно значение.

Хеш-таблица хорошо подходит, когда:

  1. Вы знаете, сколько элементов вы собираетесь сохранить до начала заполнения таблицы. Динамическое изменение размера будет очень болезненным!
  2. У вас есть хороший алгоритм хеширования с равномерным распределением, что и делает .NET
  3. Существует хороший механизм разрешения конфликтов, который. NET делает
  4. Вы ищете одно значение
  5. Вы можете гарантировать, что все значения будут уникальными

Если вы выполняете некоторое сжатие, например, RB-Tree лучше, чем Hashtable.

] Источник: http://en.wikipedia.org/wiki/Hashtable#Dynamic_resizing

1
ответ дан 29 November 2019 в 06:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: