Lo que es más rápido / más eficiente: Diccionario < cadena, objeto > o Diccionario < enum, object > ;?

StackOverflow https://stackoverflow.com/questions/820200

  •  03-07-2019
  •  | 
  •  

Pregunta

¿Son los tipos enumeración más rápidos / más eficientes que los tipos cadena cuando se usan como claves de diccionario?

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

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

Considere lo siguiente: NOTA: solo 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 los anteriores será mejor si se usa como clave en un diccionario!

¿Fue útil?

Solución

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

Puede evitar el problema del comparador utilizando Dictionary < int, object > y lanzar las claves enum a int s o especificando un comparador personalizado .

Otros consejos

Creo que deberías empezar por enfocarte en la corrección. Esto es mucho más importante que la mínima diferencia entre las pequeñas diferencias de rendimiento que pueden ocurrir dentro de su programa. En este caso, me concentraría en la representación adecuada de sus tipos (enumeración parece ser la mejor). Luego, más adelante, haga un perfil de su aplicación y, si hay un problema, solo entonces debería solucionarlo.

Por lo general, hacer que el código sea más rápido en el proceso es un proceso sencillo. Toma el enlace que proporciona skolima. Si hubiera elegido enumeración, 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 definitivamente fue un problema para NHibernate, pero el hecho de si sería o no sería un problema para su programa estaría determinado únicamente por los usos.

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

Use enum para obtener un código más limpio y agradable, pero recuerde proporcionar un comparador personalizado si está preocupado por el rendimiento: http://ayende.com/Blog/archive/2009/02/21/dictionaryltenumtgt-puzzler.aspx .

Puede que no se aplique pero ...

Tenga en cuenta que las enumeraciones son compilado como constants que puede causar la reubicación de todos los ensamblajes que hacen referencia La enumeración si se altera. (Es decir, la constante está codificada en el momento de la compilación de todos los ensamblajes que la usan).

Supongo que la versión enum es más rápida. Bajo el capó, el diccionario hace referencia a todo por código de hash. Mi conjetura es que es más lento generar el código hash para una cadena. Sin embargo, esto es probablemente más lento, y ciertamente es más rápido que cualquier cosa como una cadena de comparación. Estoy de acuerdo con los otros carteles que dijeron que una enumeración es más limpia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top