PHP Classes

File: clsBenchMark.php

Recommend this page to a friend!
  Packages 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: 19 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;
        }
    }
}
?>