2011-04-21 13 views
14

¿Es una clave string más rápida que una clave int en un Dictionary<,>?Rendimiento clave para un diccionario

+3

Cómo ¿determinó que el rendimiento clave es importante en su aplicación? No hagas optimizaciones prematuras. – jgauffin

+0

Lo primero y más importante es decidir qué almacenar en el diccionario. Luego, mucho más tarde, si decide que tiene un problema de rendimiento, mida el rendimiento de su programa, identifique al candidato más importante para la optimización y comience allí. Es poco probable que su pregunta actual tenga un gran impacto, excepto quizás por usar el tipo de datos incorrecto en todo el lugar "en nombre del rendimiento". –

+0

Si su espacio de claves interno es limitado, a veces puede salirse con la 'T []' y usar el indexador como clave, lo que consume más memoria pero es bastante más rápido que usar un diccionario. –

Respuesta

19

No. Antes que nada, Dictionary [ACTUALIZADO] usa el código hash de las teclas para encontrarlas en su almacenamiento interno, en lugar de las teclas. Y Hashcode es un int. Para int, es solo el valor de int, para string debe generarse.

Así que usar int es ligeramente más rápido.


De hecho código de generación de hash de una cadena es un proceso bastante complejo (el fragmento con el reflector) [espero que esto no se toma como la violación de derechos de autor porque no es]:

fixed (char* str = ((char*) this)) 
{ 
    char* chPtr = str; 
    int num = 0x15051505; 
    int num2 = num; 
    int* numPtr = (int*) chPtr; 
    for (int i = this.Length; i > 0; i -= 4) 
    { 
     num = (((num << 5) + num) + (num >> 0x1b))^numPtr[0]; 
     if (i <= 2) 
     { 
      break; 
     } 
     num2 = (((num2 << 5) + num2) + (num2 >> 0x1b))^numPtr[1]; 
     numPtr += 2; 
    } 
    return (num + (num2 * 0x5d588b65)); 
} 
+2

Un diccionario almacena las claves también, pero usa el código hash para determinar dónde almacenarlas. Respuesta un poco inexacta –

+0

Sí. Tonto ... lo actualizaré. Quise decir para recuperar los valores. – Aliostad

+0

Pero estoy de acuerdo con usted en que int es * ligeramente * más rápido, debido a que no hay ningún cálculo que realizar, como el que tiene que hacer el método 'string.GetHashCode()'. –

Cuestiones relacionadas