.NET HashTable 대 사전-사전이 빠를 수 있습니까?


276

언제 또는 왜 Dictionary 또는 HashTable을 사용해야하는지 파악하려고합니다. 나는 여기에서 약간의 검색을 수행했으며 사람들이 내가 완전히 동의 한 사전의 일반적인 장점에 대해 이야기하는 것을 발견했습니다.

그러나 나는 또한 사전이 객체가 삽입 된 순서대로 정렬되지 않는 것을 반환하지는 않는다는 것을 읽었습니다. 해시 테이블의 위치 내가 이해하는 것처럼 이것은 일부 상황에서 HashTable이 훨씬 빠릅니다.

내 질문은, 그 상황이 무엇일까요? 위의 가정에서 내가 틀렸습니까? 어떤 상황을 다른 것보다 먼저 선택할 수 있습니까 (예 : 마지막 상황은 약간 모호합니다).


5
나는 이것을지지하고 싶지 않지만, 당신의 업장은 7,777이고 나는 당신을 위해 그것을 망치는 사람이되고 싶지 않습니다.
CaptainMarvel

답변:


298

System.Collections.Generic.Dictionary<TKey, TValue>System.Collections.Hashtable클래스 내부적 해시 테이블의 데이터 구조를 유지한다. 그들 중 어느 것도 품목의 주문 보존을 보장하지 않습니다.

대부분의 경우 권투 / 박싱 해제 문제를 남겨두고도 비슷한 성능을 가져야합니다.

그들 사이의 차 구조 차이 즉 Dictionary의존 체인 반면 해결 충돌 (각 해시 테이블 버킷 아이템리스트 유지) Hashtable용도 다시 해싱 (충돌이 발생하는 경우, 버킷에 키를 매핑하는 다른 해시 함수를 시도) 충돌 해상도를 .

Hashtable.NET Framework 2.0 이상을 대상으로하는 경우 클래스 를 사용 하면 이점이 거의 없습니다 . 에 의해 효과적으로 사용되지 않습니다 Dictionary<TKey, TValue>.


21
@ Jon- 체인 및 리 해싱에 대한 자세한 내용은 msdn.microsoft.com/en-us/library/ms379571(VS.80).aspx
RichardOD

둘 다 감사합니다. Richard가 게시 한대로 해당 페이지를 찾았습니다 ... Chaining에 대해 물어 보려고했지만 MSDN 사이트가 실제로 도움이되었습니다!
Jon

6
@Mehrdad-충돌 해결 방법에 대해 분명하지 않은 것은 이것입니다. 여러 키가 동일한 해시를 초래할 수 있다면 조회에서 올바른 값을 얻는 방법, 즉 함수가 어떤 요소를 알 수 있는지 어떻게 알 수 있습니까? 반환? 에서 msdn.microsoft.com/en-us/library/ms379571%28VS.80%29.aspx , 사전 단순히 체인 어떤 충돌 Hashtable의 클래스로 이루어집니다로는 충돌시 reprobing보다 ", 오히려 말한다 버킷 목록에 추가합니다. " 이것은 사전을 사용할 때 개발자가 걱정할 필요가없는 충돌을 의미합니까?
Howiecamp

6
@Howiecamp : 이것은와 크게 다르지 않습니다 Hashtable. 해시 테이블은 키 해시, 키 자체 및 값이라는 세 가지 정보를 항목에 저장합니다. 해시가 같은 항목의 경우 동일한 키가있는 항목을 찾아서 값을 반환하려면 목록을 탐색해야합니다. 이것도 마찬가지입니다 Hashtable. Dictionary일반적으로 사용하는 개발자 는 걱정할 필요가 없습니다.
Mehrdad Afshari

@Mehrdad 분명하게 말하면, 해시 테이블과 사전 객체 모두 키 자체를 저장하고 개발자의 충돌을 숨길 수 있습니까?
Howiecamp

111

나는 그것이 당신에게 아무 의미가 없다고 생각합니다. 하지만 들르는 사람들을 위해서만

성능 테스트-SortedList vs. SortedDictionary vs. Dictionary vs. Hashtable

메모리 할당 :

메모리 사용 성능 테스트

삽입 시간 :

삽입에 사용 된 시간

아이템 검색 시간 :

아이템 검색 시간


정렬 된 목록에 해시 테이블보다 빠른 검색이 있다는 점이 매우 흥미 롭습니다. 해시 테이블이 O (1) vs 정렬 목록 O (logn)이라고 생각했습니다. 분명히 해시 테이블이 짜증납니다. 나는 그것을 사용하지 않을 것이다.
존 헨켈

@JohnHenckel 아니요, 정렬 된 목록은 조회 속도가 느립니다. 성능 계수가 클수록 성능과 메모리 사용량이 향상됩니다. 따라서 정렬 된 목록은 차트에 따라 메모리 사용량이 가장 좋지만 삽입 및 조회와 같은 다른 영역에서는 짜증납니다.
C0DEF52

31

해시 테이블과 사전의 차이점

사전:

  • 존재하지 않는 키를 찾으려면 사전에서 오류를 반환합니다.
  • 권투 및 언 박싱이 없기 때문에 해시 테이블보다 빠른 사전.
  • 사전은 일반적인 유형이므로 모든 데이터 유형에 사용할 수 있습니다.

해시 테이블 :

  • 존재하지 않는 키를 찾으려면 Hashtable이 null을 반환합니다.
  • 박싱과 언 박싱이 필요하기 때문에 사전보다 해시 테이블이 느립니다.
  • 해시 테이블은 일반적인 유형이 아닙니다.

24

또 다른 중요한 차이점은 Hashtable 유형은 Lock-free 다중 판독기와 단일 기록기를 동시에 지원하지만 Dictionary는 지원하지 않는다는 것입니다.


8
동시 사전 지원 (.Net 4.0)
Tamilmaran

1
이 답변을 이해하는지 잘 모르겠습니다. 여기에서 msdn.microsoft.com/en-us/library/를 보면 "여러 작성자를 지원하려면 Hashtable 개체를 읽는 스레드가없는 경우 Hashtable의 모든 작업을 Synchronized 메서드에서 반환 한 래퍼를 통해 수행해야합니다. " "lock-free multiple readers"기능을 쓸모 없게 만드는 것 같습니다. 따라서 Dictionary와 마찬가지로 Hashtable에 대한 모든 액세스를 잠 가야합니다.
RenniePet

16

MSDN 기사 :는 " Dictionary<TKey, TValue>클래스는 동일한 기능이 Hashtable클래스 A는. Dictionary<TKey, TValue> (이외의 특정 유형의 Object) 더 나은 것보다 성능이 Hashtable의 요소가 있기 때문에 값 유형에 대한 Hashtable유형입니다 Object그러므로, 그리고, 권투와 저장하는 경우에 발생할 일반적으로 개봉기 또는 "값 유형 검색 중"

링크 : http://msdn.microsoft.com/en-us/library/4yh14awz(v=vs.90).aspx


11

둘 다 사실상 같은 클래스입니다 (분해를 볼 수 있습니다). .Net이 제네릭을 갖기 전에 HashTable이 처음 생성되었습니다. 그러나 사전은 일반 클래스이며 강력한 타이핑 이점을 제공합니다. Dictionary는 비용이 들지 않으므로 HashTable을 사용하지 않습니다.


8

또 다른 중요한 차이점은 Hashtable스레드 안전입니다. HashtableMR / SW (Multiple Reader / Single Writer) 스레드 안전 기능이 내장되어있어 Hashtable잠금없이 여러 판독기와 함께 하나의 Writer를 사용할 수 있습니다. 의 경우 Dictionary가 당신의 안전을 스레드 필요하다면 당신이 당신의 자신의 동기화를 구현해야합니다, 어떤 스레드 안전하지 않습니다.

더 자세히 설명하려면 :

Hashtable, 컬렉션 주변의 스레드 안전 래퍼를 반환하는 Synchronized 속성을 통해 스레드 안전을 제공합니다. 랩퍼는 모든 추가 또는 제거 조작에서 전체 콜렉션을 잠금으로써 작동합니다. 따라서 컬렉션에 액세스하려는 각 스레드는 해당 차례가 하나의 잠금을 수행하기를 기다려야합니다. 이는 확장 할 수 없으며 대규모 컬렉션의 경우 성능이 크게 저하 될 수 있습니다. 또한 디자인은 경쟁 조건으로부터 완전히 보호되지 않습니다.

닷넷 프레임 워크 2.0 컬렉션 클래스 좋아 List<T>, Dictionary<TKey, TValue>어떤 스레드 동기화를 제공하지 않는 등; 여러 스레드에서 동시에 항목을 추가하거나 제거 할 때 사용자 코드가 모든 동기화를 제공해야합니다. 스레드 안전성뿐만 아니라 유형 안전성이 필요한 경우 .NET Framework에서 동시 콜렉션 클래스를 사용하십시오. 자세한 내용은 여기를 참조하십시오.


3

사전은 제네릭 형식이라는 이점이 있으므로 복싱이 필요 없기 때문에 형식이 안전하고 조금 빠릅니다. 다음 비교 테이블 (유사한 SO 질문 게시물 에서 찾은 답변을 사용하여 구성 )은 해시 테이블에 대한 사전을 지원하는 다른 이유 중 일부를 보여줍니다 (또는 그 반대).


1

사전에 삽입 된 순서대로 항상 객체를 반환하는 읽기에 관심이있는 경우

OrderedDictionary- 정수 인덱스를 통해 값에 액세스 할 수 있습니다 (항목이 추가 된 순서대로) SortedDictionary- 항목이 자동으로 정렬됩니다


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.