2011-05-11 16 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];  

salida (32 bit):¿Por qué ordenadoDiccionario necesita tanta sobrecarga?

280108 

salida (64 bit):

480248 

Almacenamiento de los ints solo (en una matriz) requeriría aproximadamente 80000.

+0

bienvenido al .net runtime. –

+0

porque es un árbol. también hay SortedList y una lista simple que está ordenada (asegúrese de insertar elementos en su lugar) – harold

Respuesta

5

Internamente SortedDictionary<TKey, TValue> utiliza TreeSet<KeyValuePair<TKey, TValue>>. El árbol usa Node<T> y, obviamente, utiliza referencias entre nodos, por lo que, además de cada clave y valor, tendrá referencias a los nodos izquierdo y derecho, así como algunas propiedades adicionales. Node<T> es una clase, por lo que cada instancia tiene la sobrecarga tradicional de un tipo de referencia. Además, cada nodo también almacena un booleano llamado IsRed.

De acuerdo con WinDbg/SOS el tamaño de un solo nodo en 64 bits en 48 bytes, de modo que 10000 de ellos ocuparán al menos 480000 bytes.

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

¿Realmente necesita esta sobrecarga para su funcionalidad? – willem

+1

@Willem: Creo que la verdadera pregunta es; necesitas toda la funcionalidad de SortedDictionary. Si no, hay opciones que ocupan menos espacio. Consulte la sección Observaciones de la documentación para obtener una lista de características de SortedDictionary http://msdn.microsoft.com/en-us/library/f7fta44c.aspx –

2

Se depende completamente de la implementación de la clase SortedDictionary y no tiene nada que ver con el tiempo de ejecución de .NET o CLR. Puede implementar su propio diccionario ordenado y controlar qué y cuánto se asigna. Probablemente la implementación SortedDictionary no sea muy eficiente en términos de asignación de memoria.

Cuestiones relacionadas