Pregunta

Estoy escribiendo algunas funciones hash para un compilador y utilizo el tipo de datos __int64 frecuencia. El compilador está diseñado para ser sostenido (y hasta ahora es) en diferentes sistemas operativos de. Sé que __int64 es un tipo que puede ser compilado por la mayoría de los principales compiladores de C ++ para mis sistemas de destino de manera que no es el problema. Estoy usando funciones hash para hacer grandes cadenas de caracteres más pequeño y más rápido para comparar y hacer maravillas en el sistema operativo de 64 bits; pero habría una disminución suficientemente grande rendimiento en 32 bits del sistema operativo de cancelar los beneficios? Podría utilizar 32 bits enteros pero luego se reduciría en gran medida la eficacia de las funciones hash.

Editar: Es un código personalizado y muy simple. La primera función hash genera un único int de 64 bits de 12 caracteres alfanuméricos (incluyendo subrayado) caracteres. Luego de clase que maneja un hash de más de 12 caracteres mediante la creación de listas de direcciones ligado de hash de 64 bits y sobrecargas de los operadores de comparación. La sobrecarga compara están cortocircuitados y comparar la lista de direcciones ligado. Tengo pruebas ejecutadas en mi máquina de comparar la velocidad de generar aleatoriamente grandes valores hash (100 - 300 caracteres) en comparación con los mismos (en el peor de los casos senario) y resultó ser más rápido que la cadena se compara. Con el fin de simular mejor la sobrecarga de hashes que generan, también he hecho pruebas de comparar los hashes grandes pregeneradas compara contra ellos mismos. Todo esto es correr con la optimización del código de apagado. Con ~ 1 mil millones de hash se compara frente a ~ 1 mil millones cadena compara, el hash tomó alrededor de 16% del tiempo. Esto fue todo en un entorno de 64 sin embargo. Yo no tengo una máquina de 32 bits para ejecutar pruebas con

¿Fue útil?

Solución

64 bits enteros de tamaño no son sustancialmente más lento en absoluto en una arquitectura de 32 bits x86. No son tan rápido como en 32 bits enteros, obviamente, pero no son notablemente más lento. No es en absoluto imprudente usar un int de 64 bits para los hashes independientemente de x86 o x64. La sobrecarga adicional probablemente será mínimo en comparación decir, un par de asignaciones dinámicas que no sean necesarios o algoritmos que han fallado.

Otros consejos

No creo que la comparación de cuatro variables de 32 bits será más rápido que la comparación de dos variables de 64 bits, ya que supongo que el compilador generará el código más rápido: si su procesador no es compatible con las operaciones de 64 bits, su compilador generará código que lo compara en dos pasos, al igual que lo haría con la mano.
Por supuesto, esto depende de su compilador.


De todos modos, hay otras herramientas que harán que sus comparaciones aún más rápido, pero que no están disponibles en todas partes, por ejemplo, las operaciones vectoriales (proporcionado por extensiones SSE) que permiten comparar incluso 8 * 4 bytes a la vez.

Si usted necesita para optimizar su código lo más posible me gustaría sugerir que usted pueda añadir algunas directivas del preprocesador para permitir optimizaciones sólo cuando el sistema soporta ellos.

¿Estás seguro de que sería disminuir en gran medida la eficacia de la función hash? ¿Se ha quedado pruebas? Ciertamente 64 bits es un hash mejor que 32 bits si (i) el número de elementos hash es significativamente más de 2 ^ 16 y (ii) calcular el hash de 64 bits es barato. ¿Cuál de (i) o (ii) (o ambos) que es cierto en su caso? Si el rendimiento es importante, es posible que desee utilizar diferentes funciones hash, dependiendo del sistema operativo subyacente. De lo contrario, yo diría: escribir una versión de 32 bits, y una versión de 64 bits; tratar a ambos en un sistema de 64 bits, y un sistema de 32 bits; y verá si vale la pena que revienta una tripa más.

Todo función hash que he utilizado el valor de retorno de una matriz de bytes (UCHAR) para evitar su problema.

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