.NET HashTable Vs Dictionary - может ли словарь быть таким же быстрым?


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

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

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

9 248

9 ответов:

System.Collections.Generic.Dictionary<TKey, TValue> и System.Collections.Hashtable классы оба поддерживают структуру данных хэш-таблицы внутри. ни один из них не гарантирует сохранение порядка элементов.

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

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

там мало пользы, чтобы использовать Hashtable класс, если вы ориентируетесь на .NET Framework 2.0+. Он эффективно устаревает Dictionary<TKey, TValue>.

Я думаю, что это ничего не значит для вас сейчас. Но только для справки для людей, останавливающихся

- тестов производительности - парам и словаре sorteddictionary и словарь и хеш -

еще одно важное отличие заключается в том, что тип Hashtable поддерживает несколько читателей без блокировки и один писатель одновременно, а словарь-нет.

различия между Hashtable и Dictionary

словарь:

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

Hashtable:

  • Hashtable возвращает null, если мы попытаемся найти ключ, который не существует.
  • Hashtable медленнее, чем словарь, потому что он требует бокса и распаковки.
  • Hashtable не является универсальным типом,

статья MSDN: "the Dictionary<TKey, TValue> класс имеет то же самое функциональность как Hashtable класса. А Dictionary<TKey, TValue> определенного типа (кроме Object) имеет лучшую производительность, чем Hashtable для типов значений, потому что элементы Hashtable все типа Object и, следовательно, бокс и распаковка обычно происходят, если хранение или извлечение типа значения".

Ссылка:http://msdn.microsoft.com/en-us/library/4yh14awz (v=против 90). aspx

оба фактически являются одним и тем же классом (вы можете посмотреть на разборку). Хэш-таблица была создана до того, как .Net имел дженерики. Словарь, однако, является общим классом и дает вам сильные преимущества ввода. Я бы никогда не использовал HashTable, так как словарь ничего не стоит вам использовать.

еще одно важное отличие заключается в том, что Hashtable является потокобезопасным. Hashtable имеет встроенный несколько читателей / один писатель (MR/SW) потокобезопасность, что означает Hashtable позволяет одному писателю вместе с несколькими читателями без блокировки. В случае Dictionary нет потокобезопасности, если вам нужна потокобезопасность, вы должны реализовать свою собственную синхронизацию.

уточнения:

Hashtable, предоставить какую-нить-безопасность через синхронизированы собственность, который возвращает потокобезопасную оболочку вокруг коллекции. Оболочка работает путем блокировки всей коллекции при каждой операции добавления или удаления. Поэтому каждый поток, который пытается получить доступ к коллекции, должен ждать своей очереди, чтобы получить одну блокировку. Это не масштабируемо и может привести к значительному снижению производительности для больших коллекций. Кроме того, конструкция не полностью защищена от условий гонки.

классы коллекции .NET Framework 2.0, такие как List<T>, Dictionary<TKey, TValue> и т. д. не обеспечивают никакой синхронизации потоков; пользовательский код должен обеспечивать всю синхронизацию, когда элементы добавляются или удаляются одновременно в нескольких потоках Если вам нужна безопасность типов, а также потоковая безопасность, используйте параллельные классы коллекций в .NET Framework. Дальнейшее чтение здесь.

Если вы заботитесь о чтении, которое всегда будет возвращать объекты в том порядке, в котором они вставлены в словарь, вы можете посмотреть на

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

словарь быстрее, чем hashtable, поскольку словарь является общим сильным типом. Hashtable работает медленнее, поскольку он принимает объект как тип данных, что приводит к боксу и распаковке.