miércoles, 24 de diciembre de 2008

Sobre la optimización

Publicado a las 6:39 p.m.

Hoy con Fede nos entretuvimos un rato haciendo testeos para responder a nuestra geek-curiosidad: ¿Qué es más rápido? ¿Buscar un valor en un array usando una función de PHP o invertirlo y buscar por clave?

Para los interesados, la cosa era así. Opción 1:

// imaginemos que este es un array más grande...
$a = array('uno','dos','tres');
echo array_search('dos',$a);


Opción 2:

$a = array('uno','dos','tres');
// se intercambian las claves con los valores,
// el array pasa de 1 => 'uno', 2 => 'dos' a 'uno' => 1, 'dos' => 2
$b = array_flip($b);
echo $a['dos'];


Nuestro hunch era que la opción 2 iba a tardar menos. Si hubiéramos seguido nuestro instinto y no hubiéramos hecho los tests, nunca nos hubiéramos enterado de que en promedio la opción 1 es en promedio 5 veces más rápida que la opción 2. Esto me lleva a postear lo siguiente:

Rules of Optimization:
Rule 1: Don't do it.
Rule 2 (for experts only): Don't do it yet.

4 comentarios:

Alexander dijo...
25/12/08 6:59 p.m.

Jajjaaj nerdos!
Sin mencionar que la opcion 1 va a funcionar en menos tiempo porque vas a tener menos para escribir =P

Feliz Kwanzaa!

Mad Bunny dijo...
26/12/08 2:22 p.m.

Salud a las reglas de la optimización.

(en donde se va el tiempo en el 2, en el flip o en el acceso?)

Pablo Borowicz dijo...
26/12/08 4:02 p.m.

@Mad Bunny: yo calculo que en el flip, porque tiene que recorrer todo el array y armarlo de nuevo, cada vez (el test fue 1000 array_search() contra 1000 flip - acceso). Por eso sospecho que debe ser más óptimo hacer un flip y 1000 accesos que 1000 array_search(). Pero esa será otra historia que será contada en otra ocasión :P

Anónimo dijo...
31/12/08 11:45 p.m.

em... no entiendo por que pensaban que lo del flip iba a ser más rápido...
Con el search mirás cada elemento del array sólo una vez, mientras que con el flip no sólo mirás todos para generar el nuevo array, sino que también tenés el overhead de generar un array, y después lo tenés que acceder...
Claro que 5 es mucho, pero no me hubiera sorprendido que ande casi 3 veces más lento