> Manuales > Taller de PHP

Benchmarking en PHP: cómo calcular el tiempo de ejecución de scripts PHP, midiendo el tiempo en microsegundos antes y después de la ejecución del script.

El otro día estaba revisando un script en PHP que tardaba un tiempo excesivo en ejecutarse. Estuve un rato revisando el script visualmente y no encontraba una razón aparente a tanta demora, así que me puse a medir los tiempos de ejecución de cada bloque de script para ver en qué parte estaba ocupando tanto tiempo de procesamiento.

Después de revisar por DesarrolloWeb.com, vi que nosotros no teníamos publicado nada sobre el tema, a no ser varios scripts listos para usar que hacen benchmarking en PHP. Pero no quería ponerme a instalar un script de terceros, pues mis pruebas eran bien simples y a través de la función microtime() de PHP sabía que se podía sacar fácilmente el tiempo en milisegundos de cualquier instante, lo que me serviría para controlar el tiempo de ejecución de mis scripts.

Así que voy a publicar un script sencillo con el que se puede obtener el tiempo de ejecución de un script en PHP.

Realmente nuestro ejemplo es tan simple que casi no necesita explicarse, pero sirva de guía esta enumeración de puntos que vamos a realizar para extraer los tiempos de ejecución.

  1. Obtener el tiempo inicial en microsegundos, con la función microtime() de PHP.
  2. Ejecutar un script cuyo tiempo de procesamiento queremos calcular.
  3. Obtener de nuevo el tiempo en microsegundos, que será el instante final.
  4. Al tiempo final, le resto el tiempo inicial y así obtengo el tiempo de procesamiento de ese script.

Función microtime() de PHP

Antes de continuar, habría que comentar algo sobre la función microtime de PHP. Esta función nos devuelve el tiempo en microsegundos actual. Pero en realidad no devuelve un número (los microsegundos actuales) como podríamos pensar, sino que retorna un string con dos valores separados por un espacio. El primero de los valores del string es un número en coma flotante con los microsegundos (es decir, la parte decimal de los segundos). Y el segundo valor del string es el timestamp actual.

Es decir, microtime devuelve un valor como "0.22349800 1236711625", donde 1236711625 es el timestamp actual y 0.22349800 es la parte decimal de los segundos para llegar a la precisión de microsegundos. Estos valores, pues, tendremos que procesarlos para obtener un número en coma flotante con los segundos y microsegundos.

Para obtener un solo valor en coma flotante con los segundos y la parte decimal para llegar a la precisión de microsegundos, podemos hacernos nosotros mismos una función, para llamarla en lugar de invocar a microtime(). Esto se hace con la siguiente función, extraída directamente de la documentación de PHP:

function microtime_float()
{
list($useg, $seg) = explode(" ", microtime());
return ((float)$useg + (float)$seg);
}

Ahora bien, en PHP 5 existe un parámetro que se le envía a la función microtime, que sirve para que nos devuelva directamente un número en coma flotante con los segundos y microsegundos en un único valor. Ese parámetro es un boleano, que se indica opcionalmente. Cuando se pasa un valor true, nos devuelve directamente el valor en coma flotante. Cuando se pasa un valor false o no se indica nada como parámetro, nos devuelve el string que habíamos comentado antes.

Así pues, para que nos devuelva un único valor en coma flotante, podemos utilizar directamente esta llamada a microtime:

microtime(true);

Pero claro, esto sólo funciona en PHP 5, con lo que si nuestro servidor tiene PHP 4 tendremos que utilizar la función microtime_float() que habíamos escrito antes.

Calcular el tiempo de ejecución de un script

Ahora voy a poner dos scripts que realizan una cuenta del tiempo, con una precisión de microsegundos, de ejecución de un script. Una para PHP 4 y otra para PHP 5.

Primero vamos a ver la función que serviría para PHP 4 en adelante:

function microtime_float()
{
list($useg, $seg) = explode(" ", microtime());
return ((float)$useg + (float)$seg);
}

$tiempo_inicio = microtime_float();

// hago un bucle, simplemente para hacer un script que tarde un poco
for ($i=0; $i<3000000; $i++){
}

$tiempo_fin = microtime_float();
$tiempo = $tiempo_fin - $tiempo_inicio;

echo "Tiempo empleado: " . ($tiempo_fin - $tiempo_inicio);


Estamos utilizando la función microtime_float(), para procesar el dato que devuelve microtime en versiones antiguas de PHP. Como se puede ver, se calcula el tiempo inicial y luego el final. Para mostrar el resultado restamos al tiempo final el tiempo inicial.

Ahora veamos cómo se puede simplificar este script con el parámetro boleano que dispone la función microtime a partir de PHP 5.

$tiempo_inicio = microtime(true);

// hago un bucle, simplemente para hacer un script que tarde un poco
for ($i=0; $i<3000000; $i++){
}

$tiempo_fin = microtime(true);

echo "Tiempo empleado: " . ($tiempo_fin - $tiempo_inicio);

Recuerda que este método simplificado sólo funciona en PHP 5. En PHP 4 no daría error, pero el dato que recibiremos no será correcto en muchos casos, porque sólo está restando la parte decimal y no los segundos en si.

Por último podríamos redondear los números decimales con PHP para mostrar un dato con menos precisión, pero con más facilidad de lectura. Supongamos que sólo nos interesan los primeros 4 decimales, entonces podríamos redondear de la siguiente manera:

echo "<br>Tiempo de ejecución redondeado: " . round($tiempo_fin - $tiempo_inicio, 4)

A partir de estas funciones seguramente podrás crear por tu cuenta un sistema para hacer un benchmarking (medición del rendimiento) de tus scripts PHP y así saber el tiempo de procesamiento de los mismos, para poder optimizar tus aplicaciones PHP.

En el siguiente artículo estudiamos una clase PHP para medir el tiempo de ejecución de cualquier script PHP4 o PHP5, fácilmente reutilizable con programación orientada a objetos.

Miguel Angel Alvarez

Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...

Manual