2011-05-11 3 views
5
long b = GC.GetTotalMemory(true); 
SortedDictionary<int, int> sd = new SortedDictionary<int, int>(); 
for (int i = 0; i < 10000; i++) 
{ 
    sd.Add(i, i+1); 
} 
long a = GC.GetTotalMemory(true); 
Console.WriteLine((a - b));    
int reference = sd[10];  

출력 (32 비트) :왜 sortedDictionary에 많은 오버 헤드가 필요합니까?

280108 

출력 (64 비트) 단독 (배열)을하는 int 저장

480248 

약 80000.

+0

. NET 런타임에 오신 것을 환영합니다. –

+0

나무이기 때문에. SortedList와 정렬되는 일반 목록이 있습니다. (적절한 위치에 항목을 삽입하십시오.) – harold

답변

5

내부적으로 SortedDictionary<TKey, TValue>TreeSet<KeyValuePair<TKey, TValue>>을 사용합니다. 트리는 Node<T>을 사용하며 분명히 노드 사이의 참조를 사용하므로 각 키와 값 외에도 왼쪽 및 오른쪽 노드와 몇 가지 추가 속성에 대한 참조가 있습니다. Node<T>은 클래스이므로 각 인스턴스에는 기존의 참조 유형의 오버 헤드가 있습니다. 또한 각 노드에는 IsRed이라는 부울이 저장됩니다.

WinDbg/SOS에 따르면 48 비트에서 64 비트의 단일 노드 크기이므로 10000 개가 480000 바이트 이상을 차지합니다.

0:000> !do 0000000002a51d90 
Name:   System.Collections.Generic.SortedSet`1+Node[[System.Collections.Generic.KeyValuePair`2[[System.Int32, mscorlib],[System.Int32, mscorlib]], mscorlib]] 
MethodTable: 000007ff000282c8 
EEClass:  000007ff00133b18 
Size:  48(0x30) bytes  <== Size of a single node 
File:   C:\windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll 
Fields: 
       MT Field Offset     Type VT  Attr   Value  Name 
000007feeddfd6e8 4000624  18  System.Boolean 1 instance    0  IsRed 
000007feee7fd3b8 4000625  20 ...Int32, mscorlib]] 1 instance 0000000002a51db0 Item 
000007ff000282c8 4000626  8 ...lib]], mscorlib]] 0 instance 0000000002a39d90 Left 
000007ff000282c8 4000627  10 ...lib]], mscorlib]] 0 instance 0000000002a69d90 Right 
+0

기능에 대한 오버 헤드가 실제로 필요합니까? – willem

+1

@Willem : 나는 진짜 질문이 있다고 생각한다; SortedDictionary의 모든 기능이 필요합니까? 그렇지 않으면 공간을 적게 차지하는 옵션이 있습니다. SortedDictionary의 특성 목록은 문서의 설명 절을 참조하십시오. http://msdn.microsoft.com/en-us/library/f7fta44c.aspx –

2

을 요구 그것은 완전히 SortedDictionary 클래스의 구현과. NET 런타임 또는 CLR과는 아무런 관련이 없습니다. 당신은 당신 자신의 정렬 된 사전을 구현할 수 있으며, 할당 된 내용과 양을 제어 할 수 있습니다. SortedDictionary 구현은 메모리 할당면에서 그리 효율적이지는 않습니다.

관련 문제