miércoles, 17 de noviembre de 2010

Cuestión de eficiencia

Hola querido lector,
hoy voy a hablarte de algo diferente, concretamente, sobre las alegrías de optimizar un algoritmo.
Vaya, si te dedicas al mundillo del software, estarás riéndote a carcajadas mientras te caes de la silla, o igual sólo le dedicas una mirada especial a esa persona que te fustiga para tener las cosas a menos dos días.
Bueno, no pienso enrollarme mucho en este post, asi que vamos al grano.
La historia de hoy viene a cuento de un cliente que solicitó generar una serie de códigos alfanuméricos, nada del otro mundo, ¿verdad?
Pones un montón de monos con máquinas de escribir, y seguro que algo sale, sin contar el tiempo necesario para transcribir los códigos, o comprar un scanner y un ocr (venga, anímate, estamos en crisis y hay que levantar a las pequeñas empresas).
Otra opción podría ser usar una máquina enigma, tecnología retro y muy robusta (o casi).
Ah, espera, no te conté un detalle: los códigos deben ser alfanuméricos, con un tamaño determinado y no repetirse ninguno de ellos.
Esto complica las cosas, ¿no crees?
Bien, digo complica, porque se me cayeron los ojos de las cuencas cuando el cliente me dijo que se tardaba como 48 horas en generar aproximadamente un millón de códigos.
¿Cómo? ¿48 horas? ¿Tienes un monje tibetano escribiendo códigos a mano?
No sé cómo ni quien lo hizo, ni quiero saberlo, pero merece arder lentamente en una pira crematoria.
Sin entrar mucho en detalles, da la impresión de haberse usado un algoritmo que genere un código, lo compruebe contra la lista de códigos ya generados, y así sucesivamente... ¿verdad que te suena a anidar dos bucles con el mismo número de ejemplares?
Insisto en que no conozco el algoritmo original, pero es plausible, o se habrían estado generando códigos desde el bigbang.
Ante semejante perspectiva, te paras, sales a coger aire, muerdes la pared para desahogarte (está dura, muy dura y no tiene calcio) y piensas, piensas, piensas...
El problema de pensar mucho una solución, es que acabas ofuscándote y no la encuentras, y de paso te ganas un buen dolor de cabeza.
Pasas a hacer otra cosa, o simplemente das un paseo, y... ¡bingo!
Haciendo memoria, recuerdas que los hashes son muy rápidos ... haces una prueba ... ¡et voilá!
Reduces el tiempo de generación, de 2 días a 40 segundos aproximadamente, para una muestra de 1 millón de códigos.
Mejor, ¿verdad?
Ten presente, antes de tirarte al cuello y pretender optimizar más el algoritmo, varios factores:



  • Cada código alfanumérico se genera con una función externa, más o menos compleja pero necesaria para garantizar una aleatoriedad suficiente

  • Tienes que almacenar los códigos generados de manera persistente (fichero, base de datos)


Sí, en efecto, se puede optimizar más el algoritmo, pero para un uso esporádico, va más que sobrado, ¿no te parece?.


Hasta aquí la historia de hoy, espero que lo hayas pasado bien leyendo estas líneas.