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

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

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

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



답변

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

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

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

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


답변

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

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

메모리 할당 :

메모리 사용 성능 테스트

삽입 시간 :

삽입에 사용 된 시간

아이템 검색 시간 :

아이템 검색 시간


답변

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

사전:

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

해시 테이블 :

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

답변

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


답변

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


답변

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


답변

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

더 자세히 설명하려면 :

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

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