.NET HashTable Vs Dictionary - может ли словарь быть таким же быстрым?
Я пытаюсь выяснить, когда и почему использовать словарь или хэш-таблицу. Я немного поискал здесь и нашел людей, говорящих об общих преимуществах словаря, с которыми я полностью согласен, что приводит к преимуществу бокса и распаковки для небольшого увеличения производительности.
но я также читал словарь не всегда будет возвращать объекты в том порядке, в котором они вставлены, вещь сортируется. Где в качестве хэш-таблицы будет. Как я это понимаю это приводит к тому, что хэш-таблица намного быстрее для некоторых ситуаций.
мой вопрос действительно, что это могут быть за ситуации? Я просто ошибаюсь в своих предположениях выше? Какие ситуации вы можете использовать, чтобы выбрать один над другим (да, последний немного неоднозначен).
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 - товары автоматически сортируются