<?php
/**
* Function and code coverage benchmark class.
* Calculates execution time of particular function and/or block of code.
*
* @author Borislav Nedelchev
* @package BenchTools
* @version 1.1
* @link snairl(at)yahoo(dot)com
* @copyright 2006 (c) Borislav Nedelechev
*
*/
class CBenchmark{
/**
* Results from bechmarking
* @access protected
*
* @var mixed
*/
var $tests;
/**
* Total execution time of all code
* @access protected
*
* @var float
*/
var $total_time;
/**
* Last label using with start method
* @access protected
*
* @var string
*/
var $last_label;
function Benchmark(){
$this->tests=array();
$this->last_label=false;
}
/**
* @access private
* @return float
*/
function GetMicrotime()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
/**
* Benchmark execution of given function or class method
* @access public
*
* @param string $label
* @param mixed $func function or class method to be benchmarked
* @param mixed $params
*/
function do_benchmark($label,$func,$params=false){
$start=$this->GetMicrotime();
call_user_func_array($func,$params);
$this->tests[$label]=$this->GetMicrotime()-$start;
}
/**
* @access private
* @param int $time
*/
function calcTotalTime($time){
$this->total_time+=$time;
}
/**
* Display benchmark results
* @access public
*
*/
function ShowResults(){
$this->End();
asort($this->tests);
reset($this->tests);
$this->total_time=0;
array_walk($this->tests,array(&$this,'calcTotalTime'));
printf("Total execution time:%.3fs\n",$this->total_time);
while (list($label,$val)=each($this->tests)) {
$percents=($val/$this->total_time)*100;
printf("Function: [%'.-20s] Time:%.3fs (%04.1f%%)\n",$label,$val,$percents);
}
echo("Function compare:\n");
$copy=$this->tests;
while (list($label,$val)=each($this->tests)) {
printf("%s:\n",$label);
foreach ($copy as $comp_label=>$com_val){
if($label==$comp_label)continue;
$percents=(($com_val/$val)-1)*100;
if($percents<0)$measure='slower';
elseif($percents>0)$measure='faster';
else $measure='equal ';
printf("-[%'.20s] %' 10.1f%% - %s\n",$comp_label,abs($percents),$measure);
}
}
}
/**
* Start benchmark code coverage
*
* @access public
* @param string $label
*/
function Start($label){
$this->End();
$this->tests[$label]=$this->GetMicrotime();
$this->last_label=$label;
}
/**
* End of code coverage benchmark.
*
* @access public
* @param string $label if not provided last used label in Start function
* will be used
*/
function End($label=false){
if($label===false && $this->last_label)
{
$label=$this->last_label;
}
if($label)
{
$this->tests[$label]=$this->GetMicrotime()-$this->tests[$label];
$this->last_label=false;
}
}
}
?>
|