Зачем sortedDictionary нужно так много накладных расходов? - PullRequest
5 голосов
/ 11 мая 2011
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 бита):

280108

выход (64 бита):

480248

Для хранения только целых чисел (в массиве) потребуется около 80000.

Ответы [ 2 ]

5 голосов
/ 11 мая 2011

Внутренне SortedDictionary<TKey, TValue> использует TreeSet<KeyValuePair<TKey, TValue>>.Дерево использует Node<T> и, очевидно, оно использует ссылки между узлами, поэтому в дополнение к каждому ключу и значению у вас будут ссылки на левый и правый узлы, а также некоторые дополнительные свойства.Node<T> является классом, поэтому каждый экземпляр имеет традиционные издержки ссылочного типа.Кроме того, каждый узел также хранит логическое значение с именем IsRed.

В соответствии с WinDbg / SOS размер одного узла на 64 бита в 48 байтах, поэтому 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
2 голосов
/ 11 мая 2011

Это полностью зависит от реализации класса SortedDictionary и не имеет никакого отношения к среде выполнения .net или CLR. Вы можете реализовать свой собственный отсортированный словарь и контролировать, что и сколько выделяется. Вероятно, реализация SortedDictionary не очень эффективна с точки зрения выделения памяти.

...