2012-11-17 4 views
3

일부 enum이 있다고 가정합니다. 예 :사전에 저장하는 배열 VS에 enum을 저장 하시겠습니까?

enum MyEnum 
{ 
    Item1, 
    Item2, 
    Item3 
} 

열거 형의 각 항목에 대해 "캐시"를 원합니다. 그래서 두 가지 옵션이 있습니다.

사전 옵션 :

Dictionary<MyEnum, /*someStructure*/> cache = new Dictionary<MyEnum, /*someStructure*/>>();

또는 배열 옵션 :

/*someStructure*/[] cache = new /*someStructure*/[Enum.GetValues(typeof(MyEnum)).Length] 

각 옵션의 prons과 단점은 무엇입니까? 제 생각에는 Dictionary 옵션이 더 읽기 쉽고 사용하기 쉽지만, Array 옵션보다 느립니다.

그러나 실제로 Dictionary은 느려 집니까? 아마도 Dictionaryenum이 키로 사용될 때 단지 "배열"을 언더링 구현으로 사용할 수 있다는 것을 이해하기에 충분히 똑똑합니까?

질문은 - "못생긴 array 옵션"이 "간단"Dictionary 옵션보다 빠르다는 것인가? 그럼 아마도 나는 그것을 테스트 할 수 있습니다 ...하지만 지금 나는 질문을 썼을 때 다른 사람들이 생각하는 것을 알고 싶습니다.

답변

4

Dictionany<TKey, TValue>은 "스마트"하지 않으며 지정된 키에 최적화되지 않습니다. 밑 부분 구현은 항상 동일합니다.

그러나, 성능에 대해, 사전에 키로 enum 값을 사용하면 예상보다 훨씬 느린이며, 키로 Int32를 저장하는 것보다을 훨씬 느립니다. 그 이유는 GetHashCode()을 호출 할 때 런타임에서 무거운 리플렉션을 사용하여 열거 형의 해시 코드를 가져 오기 때문입니다. 이것은 실제로 아주 기괴한 발견 된 경우.

그러나이 모든 것은 사전에서 키로 enum을 사용하는 가장 읽기 쉬운 방법이 충분히 빠르면 중요하지 않습니다. 그리고 여기 아무도 당신을 위해 그 질문에 대답 할 수 없습니다. 이것을 측정해야합니다. 조기 최적화를 수행하지 말고 솔루션이 자신의 상황 (아마도 그렇게 될 것입니다)에 충분히 빠르지 않을 때까지 가장 읽기 쉽고 유지 보수가 쉬운 코드를 사용하십시오.

그러나, 대신 배열로 전환하는하는 Int32 키를 사전에 전환 해보십시오 : 이것은 주관적인 답변입니다

var dictionary = new Dictionary<int, /*someStructure*/>(); 

dictionary[(int)MyEnum.Item1] = /*new someStructure()*/; 
+0

내 프로그램에서 병목 현상을 최적화하고 있습니다. 나는 1 ~ 2 마이크로 초를 보낼 무언가를 위해 18 마이크로 초를 보냈습니다. 나는이 부분에서'Dictionary'가 집중적으로 사용된다는 것을 알았습니다. 그래서 대체해야한다면 지금 생각하고 있습니다. 'int32' 키로 된 사전은 이상하게 보입니다. 왜 그걸 제안합니까? – javapowered

+0

그리고 18 마이크로 초가 너무 많습니다. 어떤 종류의 프로그램을 개발하고 있습니까? – Steven

+0

하지만 내가 말했듯이,'int' 키와 프로파일을 다시 유지하기 위해 사전을 바꾸십시오. 이것은 큰 차이를 만들어야합니다. – Steven

1

을하지만, 나는 개인적으로 사전을 통해 배열을 사용하는 경우 :

  1. 모든 열거 형 멤버의 기본 값은 연속적입니다. 모든 열거 부재 항상 구조의 값을 가질 것이다

    enum MyEnum { Units, Tens = 10, Hundreds = 100, }

  2. : 예에 따라 값 간의 큰 차이가있는 경우 배열을 사용하는 것은 직관적 (폐기물 메모리) 일 것이다. 그렇지 않은 경우 사전은 TryGetValue 메소드를 통해 특정 키의 존재 여부를 확인하는보다 직관적 인 의미를 제공합니다. (즉, null을 사용하여 값이 참조 유형 인 경우 부재를 나타낼 수 있습니다.)

관련 문제