PHP Classes

File: clsBenchMark.php

Recommend this page to a friend!
  Classes of Borislav Nedelchev   CBenchmark   clsBenchMark.php   Download  
File: clsBenchMark.php
Role: Class source
Content type: text/plain
Description: Benchmark class implementation
Class: CBenchmark
Measure the time a script takes to execute
Author: By
Last change: + Added auto End() method calling when using Start() method
# End() method
# ShowResults() method which is invoking End() now
Date: 16 years ago
Size: 3,138 bytes
 

Contents

Class file image Download
<?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;
        }
    }
}
?>