> Manuales > Taller de PHP

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.

Hace unas semanas estuve realizando unas pruebas de medición del tiempo que tardaba en ejecutarse unos scripts PHP. Esos scripts iban un poco lentos y tenía que ver en qué parte de la aplicación se retenía el proceso, para intentar optimizarlos.

El la medición del tiempo realmente es una cosa sencilla de hacer por nosotros mismos, como ya explicamos en el artículo Benchmarking en PHP, pero realmente existen productos para hacer esta tarea más rápido y con mayor cantidad de datos para analizar los tiempos.

En este artículo vamos a comentar una clase PHP (de programación orientada a objetos) que nos servirá para medir el tiempo de ejecución de scripts PHP, sin más complicaciones que incluir el código de la clase, instanciar un objeto y pasarle varios métodos para ir midiendo los tiempos en varios puntos de nuestro script. Buscando un poco he comprobado que existen varias clases que se ofrecen gratuitamente para realizar este proceso, pero yo necesitaba una que funcionase bien tanto en versiones de PHP 5 y PHP 4. Así que la que más me gustó fue Stoper, que vamos a comentar a continuación.

Para descargar la clase stoper podemos irnos al sitio PHP Classes, que tiene un repositorio de clases PHP para hacer las más diversas cosas. En concreto, encontraremos Stoper en http://www.phpclasses.org/browse/package/2152.html.

Es una clase freeware, por lo que podremos utilizarla libremente. Está creada por Marek Szewczyk

Utilización de la clase Stoper para medir el tiempo de ejecución

Vamos a explicar el uso de la clase Stoper, que veremos es realmente simple y nos permitirá medir el tiempo que tarda PHP en ejecutar un script, en instantes y sin casi alterar nuestro código.

Lo primero que tendremos que hacer es incluir el código de la clase:

include_once('class.stoper.php');

Nota: como se ha comentado, para obtener esta clase necesitamos descargarla desde el sitio de PHP Classes, en la URL mencionada antes.

Ahora tendremos que instanciar un objeto de la clase Stoper, para que se encargue de contar el tiempo.

$s = new Stoper();

Ahora veamos los tres métodos básicos para hacer funcionar la clase Stoper y contar el tiempo que pasa durante la ejecución del código PHP.

Start()
Este método sirve para indicar que comience la cuenta del tiempo por Stoper.

showResult(string)
Con este método hacemos que el objeto Stoper nos indique el tiempo que se hemos ocupado en ejecutar un script. Lo podemos ejecutar en cualquier lugar del código PHP, las veces que queramos. El tiempo lo muestra desde que se inició la cuenta con Start() o desde la última ejecución del método showResult() (si es que antes se había llamado al método). Recibe un string que sirve para anteponer un texto al número de segundos que se haya contado.

Stop()
Con este método hacemos que se pare la cuenta del tiempo. A partir de la detención del tiempo se puede invocar a showResult() y nos dará el tiempo total de la ejecución del script, desde que se invocó al método Start().

Ejemplo de uso de Stoper

Ahora veamos el ejemplo más simple de uso de la clase Stoper. Mediremos el tiempo de ejecución de un script que tiene varias partes, llamando varias veces a showResult() para observar la cantidad de segundos que ha tardado cada parte y el script completo.

<?php
//incluyo el código de la clase stoper
include_once('class.stoper.php');
//instancio un objeto de la clase stoper
$s = new Stoper();

echo 'Empiezo...<br>';
//ejecuto el método Start() para que el objeto stoper comience a contar el tiempo
$s->Start();

//hago un bucle con un millón de repeticiones
for ($i = 0; $i < 1000000; $i++) {
$letter = chr(rand(97, 122));
$digit = ord($letter);
}

//muestro el tiempo que he tardado en hacer las repeticiones
echo $s->showResult('Un millón de repeticiones del bucle: ').'<br>';

//creo un array para ordenarlo un millón de veces
$arr = array(12, 1654, 6515, 5156, 51, 654, 654, 684, 6516, 8455, 4868);
for ($i = 0; $i < 1000000; $i++) {
sort($arr);
rsort($arr);
}

//muestro el tiempo que he tardado en ordenar ese array un millón de veces
echo $s->showResult('Ordenación de un array un millón de veces: ').'<br>';

//paro la cuenta del tiempo por el objeto stoper con el método Stop()
$s->Stop();

//acabo mostrando el tiempo total de ejecución del script
echo $s->showResult('Tiempo total de ejecución: ').'<br>';
?>

Este ejemplo está sacado de la propia documentación de la clase que se obtiene al descargarla. No obstante, nosotros lo hemos comentado para que se entiendan los pasos que se van realizando.

Notas avanzadas sobre benchmarking de scripts PHP con Stoper

Existen otros métodos para hacer uso de otras funcionalidades menos útiles, pero también interesantes de Stoper.

MidTimeRestart()
Sirve para resetear la cuenta de tiempo desde el Start() o desde el último showResult(). Con este método podemos hacer que no se cuenten ciertas tareas menos importantes de la marcha de los scripts. Por ejemplo: imaginemos que hacemos Start() y luego hacemos diversas tareas que no nos preocupan de cara al benchmarking. Entonces, antes de la ejecución del bloque de código que queremos medir, hacemos una llamada al método MidTimeRestart(), para resetear la cuenta del tiempo utilizado hasta ese momento.

MidTimeRestart() podemos llamarlo también siempre que queramos resetear el tiempo calculado desde el último showResult().

<?php
include_once('class.stoper.php');
$s = new Stoper();

echo 'Empiezo...<br>';
$s->Start();

//Partes no importantes de mi script, que no deseo contar el tiempo
for ($i = 0; $i < 1000000; $i++) {
$digit = rand(0, 100);
}


//Termino las tareas no importantes y reseteo el tiempo
$s->MidTimeRestart();

for ($i = 0; $i < 1000000; $i++) {
$letter = chr(rand(97, 122));
$digit = ord($letter);
}
echo $s->showResult('Un millón de repeticiones del bucle: ').'<br>';


// Nuevas tareas poco importantes
$arr = array(12, 1654, 6515, 5156, 51, 654, 654, 684, 6516, 8455, 4868);
for ($i = 0; $i < 1000000; $i++) {
$kk = rand(12, 100);
   $kk++;
}

//vuelvo a resetear el tiempo
$s->MidTimeRestart();
for ($i = 0; $i < 1000000; $i++) {
sort($arr);
rsort($arr);
}
echo $s->showResult('Ordenación de un array un millón de veces: ').'<br>';

$s->Stop();
echo $s->showResult('Tiempo total de ejecución: ').'<br>';
//este tiempo final no contará el tiempo que se haya reseteado con MidTimeRestart()
?>

AdvStart() y AdvStop()
Con estos métodos podemos iniciar la cuenta del tiempo y detenerla de un modo avanzado, que permite la utilización de los siguientes métodos:

AdvCheckPoint(string)
Este método sirve para hacer un "checkpoint" avanzado, para contar cosas que están ocurriendo en el script por separado. Le tenemos que pasar un string que describa el elemento cuyo tiempo está midiéndose. Se utiliza en combinación con el método showAdvResults().

showAdvResults()
Este método muestra los resultados de medir el tiempo de los scripts de una manera avanzada y para ello utiliza los datos que se hayan medido con los checkpoints colocados con el método AdvCheckPoint().

Veamos cómo se usan estos dos métodos:

include_once('class.stoper.php');
$s = new Stoper();

$s->AdvStart();

for ($i = 0; $i < 100000; $i++) {
$letter = chr(rand(97, 122));
$digit = ord($letter);
}

$s->AdvCheckPoint('Primer bucle');

$some = 12345.423;
$important = 9999;
$variables = 'qwertyQWERTY';

$s->AdvCheckPoint('inicialización de variables');

for ($i = 0; $i < 100000; $i++) {
$someText = 'Lorem ipsum ('.$some.') dolor sit amet ('.$important.'), consectetuer adipiscing elit. ['.$variables.']';
}

$s->AdvCheckPoint('segundo bucle');

$s->AdvStop();

echo $s->showAdvResults();
$s->saveAdvResults();

Estos métodos avanzados además crean un fichero de texto en el propio servidor, con el reporte completo de la medición del tiempo.

Conclusión

Queda explicada esta clase para medir el tiempo de ejecución de Scripts PHP, que es bastante simple de usar y que nos puede venir bien en alguna vez para comprobar qué es lo que nos puede estar ralentizando una aplicación web. Los ejemplos los hemos sacado directamente del archivo para descarga de la clase, traduciendo y comentando para ayudar a las personas a entenderlos. Por si acaso se rompe el link para descarga de la clase, he puesto el archivo en el propio servidor de DesarrolloWeb.com. No obstante, por si el autor publica actualizaciones del script, esta descarga convendría hacerla desde el link de PHP Classes.

Miguel Angel Alvarez

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

Manual