Optimización de anagramas en Rust: de 173 a 11 nanosegundos por palabra

Fuentes: Rust Anagram Solver Optimization: From 173 to 11 Nanoseconds Per Word

El ingeniero David G. Andersen documenta en su blog la optimización de un algoritmo para resolver juegos de escalera de palabras mediante anagramas, logrando una velocidad de 11 nanosegundos por palabra. El proceso comenzó con una implementación en Rust que, al procesar el diccionario Scrabble de 178.690 entradas, requería 173 nanosegundos por palabra, una latencia inaceptable para aplicaciones en tiempo real. Andersen identificó que las asignaciones de memoria dinámicas, específicamente las listas de vectores (Vec), eran el principal cuello de botella, generando aproximadamente 161.000 asignaciones de memoria. Para resolverlo, reemplazó la estructura de datos por una tabla de hash personalizada que utiliza una lista enlazada implícita para almacenar palabras que comparten la misma firma de letras, eliminando las asignaciones redundantes y reduciendo el tiempo a 20 nanosegundos por palabra. La siguiente mejora consistió en empaquetar los conteos de letras en un entero u128 de 128 bits, evitando la manipulación de cadenas y el ordenamiento de caracteres, lo que bajó la latencia a 31 nanosegundos. Finalmente, Andersen aplicó el numeración de Gödel utilizando un conjunto optimizado de números primos asignados a cada letra para generar un identificador único de 64 bits sin colisiones. Este método, que evita la división de registros y permite comparaciones de igualdad más rápidas, redujo el tiempo final a 11 nanosegundos por palabra, demostrando la importancia de la ingeniería de bajo nivel en el rendimiento de software.