2011-07-18 18 views
6

He leído aquí en SO que Hashtable y Dictionary son prácticamente iguales, excepto por las ventajas de evitar el boxeo/unboxing.Diccionario vs uso de memoria Hashtable

Uso de la Ants Profiler I medir una aplicación muy sencilla con las siguientes estructuras:

class Node 
{ 
    Dictionary<string, Node> Children = new Dictionary<string, Node>(); 
} 

y

class NodeOld 
    { 
     Hashtable Children = new Hashtable(); 
    } 

Ok, una lista de 1,5 millones de casos de la primera toma aproximadamente 140Mb, mientras que el segundo necesita más de 700Mb (sistema de 64bits).

Entonces, hay una GRAN diferencia en la implementación, ¿no?

las hormigas de perfiles revela un gran número de objetos Hashtable + cubo en el ejemplo de grandes dimensiones ...

Entonces, ¿hay una opción equivalente (memoria inteligente) para los diccionarios, si usted tiene que pegarse a 1.1?

+0

Sospecho que Dictionary se implementa utilizando un árbol binario autoequilibrante en lugar de una tabla hash. Además, ¿el consumo de memoria que encontró después de la recolección de basura o el total acumulado? A medida que el Hashtable se redimensionaba (a medida que se agregaban más elementos), probablemente crearía más y más Cubos (aunque los más antiguos serían elegibles para la colección). –

+0

para la tabla hash que usa 700MB, muchos de los cubos están vacíos ? – saus

+0

Esto describe la implementación interna de .NET HashTable y el Diccionario http://msdn.microsoft.com/en-us/library/ms379571%28v=vs.80%29.aspx – hatchet

Respuesta

1

Incluso si estoy atascado en .NET 1.1 no estaría almacenando 1,5 millones de instancias en la memoria, por lo que no me importaría. Hashtable es probablemente la mejor estructura de datos que implementa una tabla hash que puede obtener en términos de consumo de memoria y velocidad en .NET 1.1. Por supuesto, si explicó su escenario con más detalles y si ha identificado que Hashtable es realmente un cuello de botella para su aplicación, podría haber algunas soluciones mejores.