2009-05-04 11 views
13

Son enumeración tipos más rápidos/más eficientes que cadena tipos cuando se utilizan como claves de diccionario?¿Qué es más rápido/más eficiente: Diccionario <cadena, objeto> o Diccionario <enum,object>?

IDictionary<string,object> or IDictionary<enum,object> 

De hecho, ¿qué tipo de datos es más adecuado como clave de diccionario y por qué?

considerar lo siguiente: NOTA: Sólo 5 propiedades por simplicidad

struct MyKeys 
{ 
    public string Incomplete = "IN"; 
    public string Submitted = "SU"; 
    public string Processing="PR"; 
    public string Completed = "CO"; 
    public string Closed = "CL"; 
} 

y

enum MyKeys 
{ 
    Incomplete, 
    Submitted, 
    Processing, 
    Completed, 
    Closed 
} 

¿Cuál de lo anterior será mejor si se utilizan como claves en un diccionario!

+0

¿C# tiene un equivalente de EnumMap de Java? –

Respuesta

13

Ciertamente, la versión enum es mejor (cuando ambas son aplicables y tienen sentido, por supuesto). No solo para el rendimiento (puede ser mejor o peor, consulte el muy buen comentario de Rashack) ya que se comprueba el tiempo de compilación y los resultados en un código más limpio.

Puede evitar el problema del comparador usando Dictionary<int, object> y lanzando las claves enum al int o especificando un comparador personalizado.

+9

En cuanto a rendimiento, puede que no sea verdad (sorprendentemente) - http://ayende.com/Blog/archive/2009/02/21/dictionaryltenumtgt-puzzler.aspx – Rashack

+1

Siempre puede especificar su propio comparador. Eso no es un problema con Dictionary o enum, pero el comparador –

5

Creo que debería comenzar centrándose en la corrección. Esto es mucho más importante que la diferencia mínima entre las diferencias de rendimiento menores que pueden ocurrir dentro de su programa. En este caso, me centraría en la representación correcta de tus tipos (enum parece ser el mejor). Luego, luego, perfila tu aplicación y si hay un problema, solo entonces debes arreglarlo.

Hacer código más rápido más adelante en el proceso suele ser un proceso sencillo. Tome el enlace que proporcionó skolima. Si hubiera elegido enum, habría sido una solución de aproximadamente 10 minutos para eliminar un problema de rendimiento potencial en su aplicación. Quiero enfatizar la palabra potencial aquí. Esto fue definitivamente un problema para NHibernate, pero en cuanto a si sería o no un problema, su programa estaría determinado únicamente por los usos.

Por otro lado, hacer código más correcto más adelante en el proceso tiende a ser más difícil. En un problema lo suficientemente grande, encontrará que las personas comienzan a tomar dependencias de los efectos secundarios del mal comportamiento anterior. Esto puede hacer que corregir código sin romper otros componentes sea un desafío.

1

pueden no ser aplicables, pero ...

Tenga en cuenta que las enumeraciones son compiled como constants que puede causar redistribución de todos los conjuntos que hacen referencia la enumeración si se altera. (es decir, la constante está codificada en tiempo de compilación para todos los ensamblajes que la usan).

+0

también lo haría con la versión de cadena, así que no sigo tu punto. – Seabizkit

-1

Supongo que la versión enum es más rápida. Debajo del capó, el diccionario hace referencia a todo por hashcode. Creo que es más lento generar el hashcode para una cadena. Sin embargo, esto es probablemente más lento, y sin duda es más rápido que cualquier comparación de cuerdas. Estoy de acuerdo con los otros carteles que dijeron que una enumeración es más clara.

Cuestiones relacionadas