Benchmarking de aplicaciones en PHP
Es habitual encontrarnos con situaciones en las que necesitamos mejorar el rendimiento de nuestras aplicaciones PHP, bien para resolver situaciones en las que van más despacio, o simplemente por el hecho de querer hacerlas lo más óptimas que sea posible en cuanto a rendimiento. Para ello hay diversas funciones que nos ofrece PHP que podemos utilizar, aunque también hay utilidades ya programadas por otros desarrolladores que se han encontrado en la misma situación.
A continuación presento y explico una de estas utilidades desarrollada por mi. Se trata de una clase de nombre Benchmark
, la cual se puede utilizar para realizar mediciones dentro de cualquier aplicación PHP. Dispone de la posibilidad de gestionar diferentes contadores, de forma que mediante una única instancia de la clase, podríamos controlar diferentes porciones del programa, obteniendo para cada una los datos que le correspondan.
El funcionamiento más sencillo de la clase se basa en tener un único contador, el contador por defecto, e ir mostrando por pantalla o mediante comentarios html, el tiempo que le ha costado llegar a cada punto de la aplicación. De esta forma podemos, viendo el código html de la página por ejemplo, ver en qué puntos se ha retardado más y atacar esa parte para intentar optimizarla.
<?php include_once('Benchmark.class.php'); $bench =& new Benchmark(); // inicializamos el contador por defecto $bench->timingStart(); // hacemos que la aplicación se duerma durante 2 segundos usleep(2000); echo "<!--".$bench->timingCurrent() . "-->"; // hacemos que la aplicación se duerma durante 8 segundos usleep(8000); echo "<!--".$bench->timingCurrent() . "-->"; // paramos el benchmarking $bench->timingStop(); ?> |
El ejemplo que hemos visto es el más sencillo y aunque útil, tiene una pega. En el caso de que queramos obtener una información resumida de todos los puntos por los que ha pasado, tendríamos que andar mirando la página o su código fuente. Esto no tiene porqué ser mayor problema, pero si lo tenemos que hacer varias veces puede ser bastante molesto.
Para simplificar esta situación disponemos de la opción de utilizar puntos intermedios, o delta points. Estos puntos intermedios indican al benchmarking que nos interesa guardar el tiempo que se lleva procesado hasta el momento, de forma que luego podamos recuperarlos todos de forma conjunta. Para hacer esta recuperación hay tres métodos principales:
- getDeltaPoints: nos devuelve una matriz con todos los puntos intermedios definidos para el contador que se le diga, indicando el nombre de cada punto y lo que costo llegar hasta ese punto desde el anterior.
- getDeltaPointsHtmlTable: devuelve un string conteniendo una tabla html con la información de cada punto intermedio y el tiempo que costó llegar hasta él desde el punto anterior.
- saveDeltaPointsToFile: añade al final del archivo que se le indique una nueva línea con la información del tiempo de cada punto intermedio, separándolos por «;».
En el siguiente archivo comprimido está la clase así como varios ejemplos de utilización, espero que os sea de utilidad.
Descargar el archivo: Benchmark.tgz
Muy buen trabajo, mis felicitaciones.
Me sumo. Muy buen trabajo. Mil gracias.