<?php
/**
* KumbiaPHP web & app Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://wiki.kumbiaphp.com/Licencia
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to hide@address.com so we can send you a copy immediately.
*
* Class Para el manejo de Benchmark y Profiling de un script
* esto nos permite obtener tiempo de ejecucion con el fin de
* encontrar posibles cuellos de botellas y optimizar el rendimiento
* de la aplicacion...
*
* @category Kumbia
* @package Core
* @copyright Copyright (c) 2005-2009 Kumbia Team (http://www.kumbiaphp.com)
* @license http://wiki.kumbiaphp.com/Licencia New BSD License
*/
final class Benchmark
{
/**
* Almacena los datos de un Benchmark especifico, esto para evitar colision
*
* @var name
*/
private static $_benchmark;
private static $_avgload = 0;
/**
* Inicia el reloj (profiling)
*
* @return array $_benchmark
*/
public static function start_clock ($name)
{
if (! isset(self::$_benchmark[$name])) {
self::$_benchmark[$name] = array('start_time' => microtime() , 'final_time' => 0 , 'memory_start' => memory_get_usage() , 'memory_stop' => 0 , 'time_execution' => 0);
}
}
/**
* Detiene el reloj para efecto del calculo del
* tiempo de ejecucion de un script
*
* @return array $_benchmark
*/
private static function _stop_clock ($name)
{
if (isset(self::$_benchmark[$name])) {
if (PHP_OS == 'Linux') {
$load = sys_getloadavg();
} else {
$load = 0;
}
self::$_avgload = $load[0];
self::$_benchmark[$name]['memory_stop'] = memory_get_usage();
self::$_benchmark[$name]['final_time'] = microtime();
list ($sm, $ss) = explode(' ', self::$_benchmark[$name]['start_time']);
list ($em, $es) = explode(' ', self::$_benchmark[$name]['final_time']);
self::$_benchmark[$name]['time_execution'] = number_format(($em + $es) - ($sm + $ss), 4);
return self::$_benchmark[$name]['time_execution'];
}
}
/**
* Permite obtener la memoria usada por un script
*
* @return string memory_usage
*/
public static function memory_usage ($name)
{
if (self::$_benchmark[$name]) {
self::$_benchmark[$name]['memory_usage'] = number_format((self::$_benchmark[$name]['memory_stop'] - self::$_benchmark[$name]['memory_start']) / 1048576, 2);
return self::$_benchmark[$name]['memory_usage'];
} else {
throw new KumbiaException("No existe el Benchmark para el nombre: '$name', especificado \n");
}
}
/**
* Retorna el tiempo de ejecucion del scripts (profiling)
*
* @return string time_execution
*/
public static function time_execution ($name)
{
if (isset(self::$_benchmark[$name])) {
return self::_stop_clock($name);
} else {
throw new KumbiaException("No existe el Benchmark para el nombre: $name, especificado \n");
}
}
/**
*
*
*/
public static function test ($func, $loops)
{
self::start_clock($func);
ob_start();
for ($i = 1; $i <= $loops; $i ++) {
eval($func);
}
ob_end_flush();
$time = self::time_execution($func);
echo '** Funcion: ', $func;
echo $loops, ' veces';
echo ' Tiempo: ', $time;
}
}