为什么sortedDictionary需要这么多开销?

wil*_*lem 5 c# memory-management sorteddictionary

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];    
Run Code Online (Sandbox Code Playgroud)

输出(32位):

280108
Run Code Online (Sandbox Code Playgroud)

输出(64位):

480248
Run Code Online (Sandbox Code Playgroud)

单独存储(在阵列中)将需要大约80000.

Bri*_*sen 5

内部SortedDictionary<TKey, TValue>使用TreeSet<KeyValuePair<TKey, TValue>>.树使用Node<T>并且显然它使用节点之间的引用,因此除了每个键和值之外,您还将引用左节点和右节点以及一些其他属性.Node<T>是一个类,因此每个实例都具有引用类型的传统开销.此外,每个节点还存储一个名为的布尔值IsRed.

根据WinDbg/SOS,单个节点的大小为64位,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
Run Code Online (Sandbox Code Playgroud)