Source for file Profiler.php
Documentation is available at Profiler.php
// +----------------------------------------------------------------------+
// +----------------------------------------------------------------------+
// | Copyright (c) 2002-2005 Matthias Englert <Matthias.Englert@gmx.de>. |
// +----------------------------------------------------------------------+
// | This source file is subject to version 3.00 of the PHP License, |
// | that is available at http://www.php.net/license/3_0.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// $Id: Profiler.php,v 1.15 2005/05/03 13:29:57 toggg Exp $
* Provides timing and profiling information.
* Example 1: Automatic profiling start, stop, and output.
* require_once 'Benchmark/Profiler.php';
* $profiler = new Benchmark_Profiler(TRUE);
* function myFunction() {
* $profiler->enterSection('myFunction');
* $profiler->leaveSection('myFunction');
* Example 2: Manual profiling start, stop, and output.
* require_once 'Benchmark/Profiler.php';
* $profiler = new Benchmark_Profiler();
* function myFunction() {
* $profiler->enterSection('myFunction');
* $profiler->leaveSection('myFunction');
* @author Matthias Englert <Matthias.Englert@gmx.de>
* @copyright Copyright © 2002-2005 Matthias Englert <Matthias.Englert@gmx.de>
* @license http://www.php.net/license/3_0.txt The PHP License, Version 3.0
* Contains the total ex. time of each section
var $_sections = array ();
* Notes how often a section was entered
var $_numberOfCalls = array ();
* Notes for each section how much time is spend in sub-sections
var $_subSectionsTime = array ();
* Notes for each section how often it calls which section
* Notes for each section how often it was called by which section
* Auto-starts and stops profiler
* Max marker name length for non-html output
var $_maxStringLength = 0;
* Constructor, starts profiling recording
* Destructor, stops profiling recording
function _Benchmark_Profiler () {
if (isset ($this->_auto) && $this->_auto) {
* Returns profiling informations for a given section.
if (isset ($this->_sections[$section])) {
if (isset ($this->_calls[$section])) {
$calls = $this->_calls[$section];
if (isset ($this->_callers[$section])) {
$callers = $this->_callers[$section];
$informations['time'] = $this->_sections[$section];
if (isset ($this->_sections['Global'])) {
$informations['percentage'] = number_format(100 * $this->_sections[$section] / $this->_sections['Global'], 2 , '.', '');
$informations['percentage'] = 'N/A';
$informations['calls'] = $calls;
$informations['num_calls'] = $this->_numberOfCalls[$section];
$informations['callers'] = $callers;
if (isset ($this->_subSectionsTime[$section])) {
$informations['netto_time'] = $this->_sections[$section] - $this->_subSectionsTime[$section];
$informations['netto_time'] = $this->_sections[$section];
$this->raiseError (" The section '$section' does not exists.\n" , NULL , PEAR_ERROR_TRIGGER , E_USER_WARNING );
* Returns profiling informations for all sections.
foreach($this->_sections as $section => $time) {
* Returns formatted profiling information.
$http = isset ($_SERVER['SERVER_PROTOCOL']);
global $HTTP_SERVER_VARS;
$http = isset ($HTTP_SERVER_VARS['SERVER_PROTOCOL']);
$out = '<table style="border: 1px solid #000000; ">'. "\n";
'<tr><td> </td><td align="center"><b>total ex. time</b></td>'.
'<td align="center"><b>netto ex. time</b></td>'.
'<td align="center"><b>#calls</b></td><td align="center"><b>%</b></td>'.
'<td align="center"><b>calls</b></td><td align="center"><b>callers</b></td></tr>'.
$dashes = $out = str_pad("\n", ($this->_maxStringLength + 52 ), '-', STR_PAD_LEFT );
$out .= str_pad('section', $this->_maxStringLength);
$out .= str_pad("total ex time", 22 );
$out .= str_pad("netto ex time", 22 );
foreach($informations as $name => $values) {
$percentage = $values['percentage'];
foreach($values['calls'] as $key => $val) {
$calls_str .= " $key ($val)";
foreach($values['callers'] as $key => $val) {
$callers_str .= " $key ($val)";
$out .= " <tr><td><b>$name</b></td><td>{$values['time']}</td><td>{$values['netto_time']}</td><td>{$values['num_calls']}</td>";
$out .= " <td align=\"right\">{$values['percentage']}%</td>\n";
$out .= " <td align=\"right\">{$values['percentage']}</td>\n";
$out .= " <td>$calls_str</td><td>$callers_str</td></tr>";
$out .= str_pad($name, $this->_maxStringLength, ' ');
$out .= str_pad($values['time'], 22 );
$out .= str_pad($values['netto_time'], 22 );
$out .= str_pad($values['num_calls'], 22 );
$out .= str_pad($values['percentage']. "%\n", 8 , ' ', STR_PAD_LEFT );
$out .= str_pad($values['percentage']. "\n", 8 , ' ', STR_PAD_LEFT );
return $out . '</table>';
* Returns formatted profiling information.
echo $this->_getOutput ();
* Enters "Global" section.
* @see enterSection(), stop()
* Leaves "Global" section.
* @see leaveSection(), start()
* @param string name of the code section
* @see start(), leaveSection()
if (count($this->_stack)) {
if (isset ($this->_callers[$name][$this->_stack[count($this->_stack) - 1 ]["name"]])) {
$this->_callers[$name][$this->_stack[count($this->_stack) - 1 ]["name"]]++;
$this->_callers[$name][$this->_stack[count($this->_stack) - 1 ]["name"]] = 1;
if (isset ($this->_calls[$this->_stack[count($this->_stack) - 1 ]["name"]][$name])) {
$this->_calls[$this->_stack[count($this->_stack) - 1 ]["name"]][$name]++;
$this->_calls[$this->_stack[count($this->_stack) - 1 ]["name"]][$name] = 1;
$this->raiseError ("tried to enter section ". $name. " but profiling was not started\n", NULL , PEAR_ERROR_DIE );
if (isset ($this->_numberOfCalls[$name])) {
$this->_numberOfCalls[$name]++;
$this->_numberOfCalls[$name] = 1;
array_push($this->_stack, array ("name" => $name, "time" => $this->_getMicrotime ()));
* @param string name of the marker to be set
* @see stop(), enterSection()
$microtime = $this->_getMicrotime ();
if (!count($this->_stack)) {
$this->raiseError ("tried to leave section ". $name. " but profiling was not started\n", NULL , PEAR_ERROR_DIE );
if ($x["name"] != $name) {
$this->raiseError (" reached end of section $name but expecting end of " . $x["name"]. "\n", NULL , PEAR_ERROR_DIE );
if (isset ($this->_sections[$name])) {
$this->_sections[$name] += $microtime - $x["time"];
$this->_sections[$name] = $microtime - $x["time"];
if (isset ($this->_subSectionsTime[$parent['name']])) {
$this->_subSectionsTime[$parent['name']] += $microtime - $x['time'];
$this->_subSectionsTime[$parent['name']] = $microtime - $x['time'];
* Wrapper for microtime().
function _getMicrotime () {
return $microtime[1 ] . substr($microtime[0 ], 1 );
Documentation generated on Mon, 11 Mar 2019 14:18:40 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.
|