Escrito por Yosi_ el miércoles, 27 de febrero de 2008
La optimización es una asignatura obligada para todos aquellos que se proponen aprender por sí mismos un lenguaje de programación sencillo y accesible como PHP de forma medianamente seria. Hay muchas guías relativas a ello detallando los puntos más importantes y fáciles de abordar. Unos cuantos ejemplos podrían ser:
En fin, la lista podría continuar (basta con buscar en Google la cadena "optimizar PHP" para obtener todas las respuestas que se pueden necesitar), pero no es mi objetivo hacer una guía sobre eso, creo que ya hay suficiente información al respecto.
Sin embargo, un problema que se me planteó a la hora de tratar de combinar todas las posibles optimizaciones para conseguir un código tan rápido como sea posible, fue determinar hasta que punto una sintaxis determinada es más rapida que otra, y cuáles de todos los puntos descritos tienen una influencia mayor sobre el resultado final. Con el objetivo de cuantificar el retraso relativo de unas instrucciones respecto a otras, escribí el código que reproduzco a continuación:
Haciendo uso de la función "microtime" y realizando un ciclo suficientemente grande para que el resto de factores sean despreciables (dependiendo de la instrucción se debe ajustar la duración, ya que en algunos casos como incluir un archivo de gran tamaño el tiempo puede resultar excesivo, mientras que en otros resulte tan rápido que apenas sea representativo), se puede obtener un tiempo orientativo de lo que tarda en ejecutarse la instrucción de prueba (en este caso un "include") en una máquina concreta.
Evidentemente en términos absolutos esto no tiene mucho valor, porque el resultado va a estar totalmente condicionado por el servidor en el que se testea el script, pero si que nos va a servir para poder comparar la diferencia tangible que hay entre instrucciones con una finalidad similar (Ej. "include" e "include_once"), y la importancia relativa que tienen éstas frente a otras (como el uso de comillas simples o dobles). Creo que el principal objetivo de todo ésto no es tanto el fin estrictamente técnico en sí mismo, sino tratar de comprender por qué se deben hacer las cosas de uno u otro modo, y poder valorar en su justa medida la relevancia real de los consejos con los que nos van a bombardear cuando intentemos indagar en la materia, sobre todo en las situaciones en las que dos posibles optimizaciones (ya sea buscando velocidad o claridad) entren en conflicto.
- Evitar el uso de la función "echo" si se puede mostrar HTML literal fuera del código PHP.
- No hacer llamadas a funciones en el interior de un ciclo. Es preferible, si es posible, volcar el retorno de la función en una variable previamente, ya que evidentemente es más rápido evaluar una variable que llamar a una función.
- Utilizar comillas simples para las cadenas que no se deben evaluar (esto es, que no contienen variables en su interior y por tanto pueden mostrarse de forma literal), ya que son más rápidas.
- Evitar el uso de include_once() y require_once() si no es necesario, son más lentas que include() y require().
- Reducir al mínimo el uso de variables globales, cuyo manejo es más costoso que el de variables locales.
En fin, la lista podría continuar (basta con buscar en Google la cadena "optimizar PHP" para obtener todas las respuestas que se pueden necesitar), pero no es mi objetivo hacer una guía sobre eso, creo que ya hay suficiente información al respecto.
Sin embargo, un problema que se me planteó a la hora de tratar de combinar todas las posibles optimizaciones para conseguir un código tan rápido como sea posible, fue determinar hasta que punto una sintaxis determinada es más rapida que otra, y cuáles de todos los puntos descritos tienen una influencia mayor sobre el resultado final. Con el objetivo de cuantificar el retraso relativo de unas instrucciones respecto a otras, escribí el código que reproduzco a continuación:
<?php
$numeroCiclos=100;
$ini=microtime(true);
for($i=0;$i<$numeroCiclos;$i++)
{
include('file.inc'); // instruccion o trozo de codigo a testear
}
$time=microtime(true)-$ini;
echo($time/$numeroCiclos);
?>
Haciendo uso de la función "microtime" y realizando un ciclo suficientemente grande para que el resto de factores sean despreciables (dependiendo de la instrucción se debe ajustar la duración, ya que en algunos casos como incluir un archivo de gran tamaño el tiempo puede resultar excesivo, mientras que en otros resulte tan rápido que apenas sea representativo), se puede obtener un tiempo orientativo de lo que tarda en ejecutarse la instrucción de prueba (en este caso un "include") en una máquina concreta.
Evidentemente en términos absolutos esto no tiene mucho valor, porque el resultado va a estar totalmente condicionado por el servidor en el que se testea el script, pero si que nos va a servir para poder comparar la diferencia tangible que hay entre instrucciones con una finalidad similar (Ej. "include" e "include_once"), y la importancia relativa que tienen éstas frente a otras (como el uso de comillas simples o dobles). Creo que el principal objetivo de todo ésto no es tanto el fin estrictamente técnico en sí mismo, sino tratar de comprender por qué se deben hacer las cosas de uno u otro modo, y poder valorar en su justa medida la relevancia real de los consejos con los que nos van a bombardear cuando intentemos indagar en la materia, sobre todo en las situaciones en las que dos posibles optimizaciones (ya sea buscando velocidad o claridad) entren en conflicto.
53 Comentarios
Temas relacionados:
Programación
PHP