uso - hashtable c#
.NET HashTable Vs Dictionary-¿Puede el diccionario ser tan rápido? (10)
Estoy tratando de averiguar cuándo y por qué usar un diccionario o una tabla hash. He hecho un poco de búsqueda aquí y he encontrado personas que hablan sobre las ventajas genéricas del Diccionario con las que estoy totalmente de acuerdo, lo que lleva la ventaja del boxeo y el desempaquetado para una leve ganancia de rendimiento.
Pero también he leído que el Diccionario no siempre devolverá los objetos en el orden en que se insertan, cosa que está ordenado. Donde como HashTable lo hará. Según tengo entendido, esto hace que la tabla hash sea mucho más rápida en algunas situaciones.
Mi pregunta es realmente, ¿cuáles podrían ser esas situaciones? ¿Estoy equivocado en mis suposiciones anteriores? ¿Qué situaciones podría usar para elegir una sobre la otra, (sí, la última es un poco ambigua).
Artículo de MSDN: "La clase
Dictionary<TKey, TValue>
tiene la misma funcionalidad que la claseHashtable
. UnDictionary<TKey, TValue>
de un tipo específico (distinto deObject
) tiene un mejor rendimiento que unHashtable
para tipos de valor porque los elementos deHashtable
son de tipoObject
y, por lo tanto, el boxeo y el desempaquetado suelen ocurrir si se almacena o recupera un tipo de valor ".
Enlace: http://msdn.microsoft.com/en-us/library/4yh14awz(v=vs.90).aspx
Diferencias entre Hashtable y Diccionario
Diccionario:
- El diccionario devuelve un error si intentamos encontrar una clave que no existe.
- Diccionario más rápido que un Hashtable porque no hay boxeo y unboxing.
- El diccionario es un tipo genérico, lo que significa que podemos usarlo con cualquier tipo de datos.
Tabla de picadillo:
- Hashtable devuelve un valor nulo si intentamos encontrar una clave que no existe.
- Hashtable más lento que el diccionario porque requiere boxeo y desempaquetado.
- Hashtable no es un tipo genérico,
Ambos son efectivamente la misma clase (se puede ver el desmontaje). HashTable se creó primero antes de que .Net tuviera genéricos. Diccionario, sin embargo, es una clase genérica y le da fuertes beneficios de escritura. Nunca usaría HashTable ya que el diccionario no cuesta nada para usar.
El diccionario es más rápido que la tabla hash ya que el diccionario es un tipo genérico fuerte. Hashtable es más lento, ya que toma el objeto como tipo de datos que lleva al boxeo y al desempaquetado.
Los diccionarios tienen la ventaja de ser de tipo genérico, lo que los hace seguros y un poco más rápidos debido a la falta de necesidad de boxeo. La siguiente tabla de comparación (construida con las respuestas encontradas en una pregunta similar de la pregunta SO) ilustra algunas de las otras razones que admiten los diccionarios sobre tablas hash (o viceversa).
Otra diferencia importante es que Hashtable
es seguro para subprocesos. Hashtable
ha incorporado seguridad de subprocesos de lector único / escritor (MR / SW), lo que significa que Hashtable
permite UN escritor junto con varios lectores sin bloqueo. En el caso de Dictionary
no hay seguridad de subprocesos, si necesita seguridad de subprocesos debe implementar su propia sincronización.
Para seguir elaborando:
Hashtable
, proporciona cierta seguridad de subprocesos a través de la propiedad Sincronizada, que devuelve un contenedor seguro para subprocesos alrededor de la colección. La envoltura funciona al bloquear toda la colección en cada operación de agregar o quitar. Por lo tanto, cada subproceso que intenta acceder a la colección debe esperar su turno para tomar el bloqueo. Esto no es escalable y puede causar una degradación significativa del rendimiento para colecciones grandes. Además, el diseño no está completamente protegido de las condiciones de la carrera.Las clases de colección de .NET Framework 2.0 como
List<T>
,Dictionary<TKey, TValue>
, etc. no proporcionan ninguna sincronización de subprocesos; el código de usuario debe proporcionar toda la sincronización cuando se agregan o eliminan elementos en varios subprocesos simultáneamente. Si necesita seguridad de tipo y seguridad de subproceso, use clases de colecciones concurrentes en .NET Framework. Lectura adicional aquí.
Otra diferencia importante es que el tipo Hashtable admite múltiples lectores sin bloqueo y un solo escritor al mismo tiempo, mientras que el Diccionario no lo hace.
Si le importa leer, siempre devolverá los objetos en el orden en que se insertan en un Diccionario, puede echar un vistazo a
OrderedDictionary : se puede acceder a los valores a través de un índice entero (por el orden en que se agregaron los artículos) SortedDictionary : los artículos se ordenan automáticamente
Supongo que no significa nada para ti ahora. Pero solo como referencia para personas que se detienen
Prueba de rendimiento: lista ordenada frente a diccionario ordenado frente a tabla hash
System.Collections.Generic.Dictionary<TKey, TValue>
y System.Collections.Hashtable
ambas clases mantienen una estructura de datos de tabla hash internamente. Ninguno de ellos garantiza la conservación del orden de los artículos.
Dejando de lado los problemas de boxeo / desempaquetado, la mayoría de las veces, deberían tener un rendimiento muy similar.
La principal diferencia estructural entre ellos es que Dictionary
basa en el encadenamiento (para mantener una lista de elementos para cada tabla de hash) para resolver colisiones, mientras que Hashtable
utiliza el rehashing para la resolución de colisiones (cuando se produce una colisión, intenta otra función hash para asignar la clave a un cangilón).
Hay poco beneficio en usar la clase Hashtable
si está apuntando a .NET Framework 2.0+. De hecho, se vuelve obsoleto por Dictionary<TKey, TValue>
.