programing

.NET 해시 테이블 대 사전 - 사전이 그렇게 빠를 수 있습니까?

newstyles 2023. 6. 8. 19:27

.NET 해시 테이블 대 사전 - 사전이 그렇게 빠를 수 있습니까?

저는 언제 그리고 왜 사전이나 해시 테이블을 사용해야 하는지 알아내려고 합니다.저는 여기서 약간의 검색을 했고 사람들이 제가 전적으로 동의하는 사전의 일반적인 장점에 대해 이야기하는 것을 발견했습니다. 이 사전은 약간의 성능 향상을 위해 복싱과 언복싱 이점을 주도합니다.

하지만 나는 또한 사전이 항상 객체를 삽입된 순서대로 반환하지는 않는다는 것을 읽었습니다. 그것은 정렬된 것입니다.해시 테이블이 할 수 있는 것과 같습니다.제가 알기로는 해시 테이블이 일부 상황에서 훨씬 더 빨라지는 것으로 알고 있습니다.

제 질문은 정말로, 그 상황들은 무엇일까요?위의 제 추측이 틀렸을 뿐인가요?어떤 상황을 사용하여 다른 상황보다 먼저 선택할 수 있습니까? (네, 마지막 상황은 약간 모호합니다.)

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

권투/언복싱 문제는 제쳐두고, 대부분의 경우, 그들은 매우 유사한 성능을 가져야 합니다.

그들 사이의 주요한 구조적 차이는Dictionary충돌을 해결하기 위해 체인(각 해시 테이블 버킷에 대한 항목 목록 유지)에 의존하는 반면Hashtable충돌 해결을 위해 재플래시를 사용합니다(충돌이 발생하면 다른 해시 함수를 사용하여 키를 버킷에 매핑합니다).

사용할 수 있는 이점이 거의 없습니다.Hashtable. 2를으로 하는 .NET Framework 2.0+를 대상으로 하는 경우 클래스를 지정합니다.그것은 사실상 쓸모없게 되었습니다.Dictionary<TKey, TValue>.

이제는 당신에게 아무런 의미가 없는 것 같아요.하지만 참고로 들르시는 분들은

성능 테스트 - 정렬된 목록 대정렬된 사전 대사전 대.해시 테이블

메모리 할당:

메모리 사용 성능 테스트

삽입에 사용되는 시간:

삽입에 사용된 시간

항목 검색 시간:

항목 검색 시간

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

사전:

  • 존재하지 않는 키를 찾으려 할 경우 사전에서 오류를 반환합니다.
  • 복싱과 언복싱이 없기 때문에 해시테이블보다 빠른 사전.
  • 사전은 모든 데이터 유형과 함께 사용할 수 있는 일반적인 유형입니다.

해시 테이블:

  • 해시 테이블은 존재하지 않는 키를 찾으려고 하면 null을 반환합니다.
  • 사전보다 느린 해시 테이블은 복싱과 복싱 해제가 필요하기 때문입니다.
  • 해시 테이블이 제네릭 형식이 아닙니다.

또 다른 중요한 차이점은 해시 테이블 유형이 잠금이 없는 여러 판독기와 단일 작성기를 동시에 지원하는 반면 사전은 지원하지 않는다는 것입니다.

"": "The.Dictionary<TKey, TValue>클래스는 다음과 같은 기능을 가집니다.Hashtable A급Dictionary<TKey, TValue>의 (단, 특유외의형(정) 이외의)Object가 a )보다 이 좋습니다.Hashtable 이유는 가 값유 요때문에이기 입니다.Hashtable이 형의유입니다.Object따라서 값 유형을 저장하거나 검색할 때 일반적으로 복싱과 언복싱이 발생합니다."

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

둘 다 사실상 동일한 클래스입니다(분해를 볼 수 있습니다).HashTable은 이전에 먼저 생성되었습니다.넷에는 제네릭이 있었습니다.그러나 사전은 일반 클래스이며 강력한 타이핑 이점을 제공합니다.사전은 당신이 사용할 비용이 전혀 들지 않기 때문에 나는 해시 테이블을 절대 사용하지 않을 것입니다.

또 다른 중요한 차이점은Hashtable스레드가 안전합니다. Hashtable는 다중 라이터) 하고 있으며, 는 " " " " (MR/SW)"를 의미합니다.Hashtable잠금 없이 하나의 작성기와 여러 판독기를 함께 사용할 수 있습니다.Dictionary스레드 안전이 없습니다. 스레드 안전이 필요한 경우 자체 동기화를 구현해야 합니다.

더 자세히 설명하자면:

HashtableSynchronized 속성을 통해 일부 스레드 안전성을 제공합니다. 이 속성은 컬렉션 주위에 스레드 안전 래퍼를 반환합니다.래퍼는 모든 추가 또는 제거 작업에서 전체 컬렉션을 잠그는 방식으로 작동합니다.따라서 컬렉션에 액세스하려는 각 스레드는 한 개의 잠금을 사용할 차례를 기다려야 합니다.이는 확장 가능하지 않으며 대규모 수집의 경우 상당한 성능 저하를 초래할 수 있습니다.또한, 디자인은 인종 조건으로부터 완전히 보호되지 않습니다.

. 2는 .NET Framework 2.0과 List<T>,Dictionary<TKey, TValue>등은 스레드 동기화를 제공하지 않습니다. 사용자 코드는 여러 스레드에서 항목을 동시에 추가하거나 제거할 때 모든 동기화를 제공해야 합니다. 유형 안전과 스레드 안전이 필요한 경우 .NET Framework에서 동시 컬렉션 클래스를 사용하십시오.자세한 내용은 이쪽.

사전은 일반적인 유형이라는 장점이 있는데, 이것은 복싱의 필요성이 부족하기 때문에 안전하고 조금 더 빠릅니다.다음 비교 표(유사한 SO 질문 게시물에서 발견된 답변을 사용하여 구성됨)는 해시 테이블에 대한 사전을 지원하는 다른 이유 중 일부를 보여줍니다(또는 그 반대의 경우도 있음).

항상 사전에 삽입된 순서대로 객체를 반환하는 읽기에 관심이 있다면 다음을 확인할 수 있습니다.

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

사전이 일반적인 강력한 유형이므로 사전이 해시 테이블보다 빠릅니다.해시 테이블은 객체를 데이터 유형으로 간주하여 복싱과 복싱 해제로 이어지기 때문에 속도가 느립니다.

언급URL : https://stackoverflow.com/questions/1089132/net-hashtable-vs-dictionary-can-the-dictionary-be-as-fast