Optimizando el uso de Arrays (Matrices o Vectores)
Escrito el 12/November/2007 por juan_belon
Escribir programas en PHP es muy fácil, porque su sintáxis es muy simple y efectiva. Sin embargo debemos saber ciertos conceptos básicos para escribir programas eficientes, si vas a tener un sitio con mucho tráficos, ésto se convierte en algo realmente importante, ya que esas pequeñas optimizaciones de código en cuanto a eficiencia hacen que no se sobrecarge el servidor atendiendo todas las peticiones de los clientes.
Evitar arrays de arrays ( multidimensionales )
Un array (matriz o vector) es una estructura de datos consistente en un grupo de elementos que son accedidos por una llave o índice. En la mayoría de lenguajes de programación el indice de un array es un número,pero en PHP la llave puede ser cualquier cosa ( string, integers, floats), eso es porque PHP hace un hash con el índice, gracias a esta característica podemos desarrollar programas más flexibles.
Aunque ésto puede tener un efecto negativo si usamos un “array de array”. Ejemplo:
<?php for($i=0; $i < 60000; $i++) $f[‘a‘][‘b‘][$i] = $i; ?>
Aunque a veces es necesario usar arrays multidimensionales “array de array” para hacer el código más simple y corto.
<?php $b = &$f[‘a‘][‘b‘]; //dirección de memoria del array de array for($i=0; $i < 60000; $i++) $b[$i] = $i; //Recorrer ahora el array,además de ser mas simple, // es más rápido en tiempo de ejecución porque se ahorra haces 3 hash // en cada iteración del bucle for ?>
No usar constantes sin declarar como llaves de un array
PHP procesa en $f[a] ,”a” como una constanste y si “a” no es una constante de PHP ni declarada por el usuario entonces la procesará como ‘a' quedando como $f[’a'], además es mucho más ineficiente por tener que buscar en la tabla de constantes…
Mal hecho:
<?php inicio_contador_tiempo(); for($i=0; $i < 60000; $i++) $f[a] = $i; print _fin_contador_tiempo(“Tiempo de ejecución: “); ?> Tiempo de ejecución: 0.23406291008 segundos
Bien hecho:
<?php inicio_contador_tiempo(); for($i=0; $i < 60000; $i++) $f[‘a‘] = $i; print _fin_contador_tiempo(“Tiempo de ejecución: “); ?> Tiempo de ejecución: 0.0413820743561 segundos
Podemos comprobar que la diferencia en tiempo de ejecución es muy grande, el segundo script se ejecuta al menos 6 veces más rápido que el primero, y la única diferencia es el no haber utilizado comillas (dobles o simples,es lo mismo).
No usar llamadas funciones DENTRO de las condiciones de un bucle
Intentar sacar todas las llamadas como "count()" fuera de una condición de un bucle,para que no se ejecute cada iteración, Ejemplo:
Mal hecho:
<?php $array= range( 1, 10000); inicio_contador_tiempo(); for($i=0; $i < count($array); $i++) ; print _fin_contador_tiempo(“Tiempo de ejecución: “); ?> Tiempo de ejecución: 0.0144419670105 segundos
Bien hecho:
<?php $array= range( 1, 10000); inicio_contador_tiempo(); $b = count($array); for($i=0; $i < $b; $i++) ; print _fin_contador_tiempo(“Tiempo de ejecución: “); ?> Tiempo de ejecución: 0.00201916694641 segundos
Otra opción aunque gasta recursos de memoria:
<?php $array= range( 1, 10000); inicio_contador_tiempo(); foreach($array as $k => $v); ; print _fin_contador_tiempo(“Tiempo de ejecución: “); ?> Tiempo de ejecución: 0.00279021263123 segundos
Podemos comprobar que el primer script tiene un rendimiento peor porque cada iteración llama a count() de la longitud del array. En el segundo se salva en $b, el la solución más rápida porque normalmente un array no cambia de tamaño durante el bucle… El tercer script está a medias entre los dos anteriores en cuanto a tiempo de ejecución pero consume más memoria,sin embargo si el array no tiene índices numéricos es una buena opción para iterarlos.
Seguro que quedan muchas cosas en el tintero de los arrays…
Quien da más ,aporta tu granito de code-arena XD
* Las funciones usadas:
<?php function inicio_contador_tiempo() { global $t; $t = time() + (float)microtime(); } function _fin_contador_tiempo($s) { global $t; $e = time() + (float)microtime(); return $s.($e-$t).“ segundos<br/>“; } ?>
Mención al que escribió el artículo original y me recordó recordar estas cosas tan importantes al resto de programadores de la comunidad para que luego no nos encontremos basuras sino programas elegantes,funcionales y sencillos de entender
[ http://cesarodas.com/2007/09/php-optimizing-the-use-of-arrays.html ]
Salu2 ó 3 jeje
Seguir las respuestas con el canal RSS 2.0 para ello. Puedes dejar un comentario, o trackback copiar a tu sitio.