Benchmark-1.2.9/000075500000000000000000000000001217731046300134175ustar00rootroot00000000000000Benchmark-1.2.9/Benchmark/000075500000000000000000000000001217731046300153115ustar00rootroot00000000000000Benchmark-1.2.9/Benchmark/Iterate.php000064400000000000000000000111711217731046300174200ustar00rootroot00000000000000. * * This source file is subject to the New BSD license, That is bundled * with this package in the file LICENSE, and is available through * the world-wide-web at * http://www.opensource.org/licenses/bsd-license.php * If you did not receive a copy of the new BSDlicense 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. * * @category Benchmarking * @package Benchmark * @author Sebastian Bergmann * @copyright 2002-2005 Sebastian Bergmann * @license http://www.php.net/license/3_0.txt The PHP License, Version 3.0 * @version CVS: $Id$ * @link http://pear.php.net/package/Benchmark */ require_once 'Benchmark/Timer.php'; /** * Provides timing and profiling information. * * Example 1 * * * '; * } * * $benchmark->run(100, 'foo', 'test'); * $result = $benchmark->get(); * ?> * * * Example 2 * * * '; * } * } * * $benchmark->run(100, 'myclass::foo', 'test'); * $result = $benchmark->get(); * ?> * * * Example 3 * * * '; * } * } * * $o = new MyClass(); * * $benchmark->run(100, 'o->foo', 'test'); * $result = $benchmark->get(); * ?> * * * @category Benchmarking * @package Benchmark * @author Sebastian Bergmann * @copyright 2002-2005 Sebastian Bergmann * @license http://www.php.net/license/3_0.txt The PHP License, Version 3.0 * @link http://pear.php.net/package/Benchmark */ class Benchmark_Iterate extends Benchmark_Timer { /** * Benchmarks a function or method. * * @access public * @return void */ function run() { $arguments = func_get_args(); $iterations = array_shift($arguments); $function_name = array_shift($arguments); if (is_string($function_name) && strstr($function_name, '::')) { $function_name = explode('::', $function_name); $objectmethod = $function_name[1]; } if (is_string($function_name) && strstr($function_name, '->')) { list($objectname, $objectmethod) = explode('->', $function_name); $object = $GLOBALS[$objectname]; for ($i = 1; $i <= $iterations; $i++) { $this->setMarker('start_' . $i); call_user_func_array(array($object, $objectmethod), $arguments); $this->setMarker('end_' . $i); } return(0); } for ($i = 1; $i <= $iterations; $i++) { $this->setMarker('start_' . $i); call_user_func_array($function_name, $arguments); $this->setMarker('end_' . $i); } } /** * Returns benchmark result. * * $result[x ] = execution time of iteration x * $result['mean' ] = mean execution time * $result['iterations'] = number of iterations * * @param bool $simple_output Show just the total * * @return array * @access public */ function get($simple_output = false) { $result = array(); $total = 0; $iterations = count($this->markers)/2; for ($i = 1; $i <= $iterations; $i++) { $time = $this->timeElapsed('start_'.$i, 'end_'.$i); if (extension_loaded('bcmath')) { $total = bcadd($total, $time, 6); } else { $total = $total + $time; } if (!$simple_output) { $result[$i] = $time; } } if (extension_loaded('bcmath')) { $result['mean'] = bcdiv($total, $iterations, 6); } else { $result['mean'] = $total / $iterations; } $result['iterations'] = $iterations; return $result; } } Benchmark-1.2.9/Benchmark/Profiler.php000064400000000000000000000326351217731046300176150ustar00rootroot00000000000000 * * This source file is subject to the New BSD license, That is bundled * with this package in the file LICENSE, and is available through * the world-wide-web at * http://www.opensource.org/licenses/bsd-license.php * If you did not receive a copy of the new BSDlicense 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. * * @category Benchmarking * @package Benchmark * @author Matthias Englert * @copyright 2002-2006 Matthias Englert * @license http://www.php.net/license/3_0.txt The PHP License, Version 3.0 * @version CVS: $Id$ * @link http://pear.php.net/package/Benchmark */ require_once 'PEAR.php'; /** * Provides timing and profiling information. * * Example 1: Automatic profiling start, stop, and output. * * * enterSection('myFunction'); * //do something * $profiler->leaveSection('myFunction'); * return; * } * * //do something * myFunction(); * //do more * ?> * * * Example 2: Manual profiling start, stop, and output. * * * enterSection('myFunction'); * //do something * $profiler->leaveSection('myFunction'); * return; * } * * $profiler->start(); * //do something * myFunction(); * //do more * $profiler->stop(); * $profiler->display(); * ?> * * * @category Benchmarking * @package Benchmark * @author Matthias Englert * @copyright 2002-2006 Matthias Englert * @license http://www.php.net/license/3_0.txt The PHP License, Version 3.0 * @link http://pear.php.net/package/Benchmark * @since 1.2.0 */ class Benchmark_Profiler extends PEAR { /** * Contains the total ex. time of each section * * @var array * @access private */ var $_sections = array(); /** * Calling stack * * @var array * @access private */ var $_stack = array(); /** * Notes how often a section was entered * * @var array * @access private */ var $_numberOfCalls = array(); /** * Notes for each section how much time is spend in sub-sections * * @var array * @access private */ var $_subSectionsTime = array(); /** * Notes for each section how often it calls which section * * @var array * @access private */ var $_calls = array(); /** * Notes for each section how often it was called by which section * * @var array * @access private */ var $_callers = array(); /** * Auto-starts and stops profiler * * @var boolean * @access private */ var $_auto = false; /** * Max marker name length for non-html output * * @var integer * @access private */ var $_maxStringLength = 0; /** * Constructor, starts profiling recording * * @param bool $auto Automatically start benchmarking * * @access public */ function Benchmark_Profiler($auto = false) { $this->_auto = $auto; if ($this->_auto) { $this->start(); } $this->PEAR(); } /** * Close method, stop profiling recording and display output. * * @access public * @return void */ function close() { if (isset($this->_auto) && $this->_auto) { $this->stop(); $this->display(); } } /** * Returns profiling informations for a given section. * * @param string $section Section to retrieve * * @return array * @access public */ function getSectionInformations($section = 'Global') { if (isset($this->_sections[$section])) { $calls = array(); if (isset($this->_calls[$section])) { $calls = $this->_calls[$section]; } $callers = array(); if (isset($this->_callers[$section])) { $callers = $this->_callers[$section]; } $informations = array(); if (isset($this->_sections['Global'])) { $value = $this->_sections[$section] / $this->_sections['Global']; $value = $value * 100; $informations['percentage'] = number_format($value, 2, '.', ''); } else { $informations['percentage'] = 'N/A'; } $informations['time'] = $this->_sections[$section]; $informations['calls'] = $calls; $informations['num_calls'] = $this->_numberOfCalls[$section]; $informations['callers'] = $callers; $value = $this->_sections[$section]; if (isset($this->_subSectionsTime[$section])) { $value -= $this->_subSectionsTime[$section]; } $informations['netto_time'] = $value; return $informations; } else { $this->raiseError("The section '$section' does not exists.\n", null, PEAR_ERROR_TRIGGER, E_USER_WARNING); } } /** * Returns profiling informations for all sections. * * @access public * @return array */ function getAllSectionsInformations() { $informations = array(); foreach ($this->_sections as $section => $time) { $informations[$section] = $this->getSectionInformations($section); } return $informations; } /** * Returns formatted profiling information. * * @param string $format output format (auto, plain or html), default auto * * @see display() * @access private * @return string */ function _getOutput($format) { /* Quickly find out the maximun length: Ineffecient, but will do for now! */ $informations = $this->getAllSectionsInformations(); $names = array_keys($informations); $maxLength = 0; foreach ($names as $name) { if ($maxLength < strlen($name)) { $maxLength = strlen($name); } } $this->_maxStringLength = $maxLength; if ($format == 'auto') { if (function_exists('version_compare') && version_compare(phpversion(), '4.1', 'ge')) { $format = isset($_SERVER['SERVER_PROTOCOL']) ? 'html' : 'plain'; } else { global $HTTP_SERVER_VARS; $use_html = isset($HTTP_SERVER_VARS['SERVER_PROTOCOL']); $format = $use_html ? 'html' : 'plain'; } } if ($format == 'html') { $out = ''."\n"; $out .= ''. ''. ''. ''. '' . ''. "\n"; } else { $dashes = str_pad("\n", ($this->_maxStringLength + 75), '-', STR_PAD_LEFT); $out = $dashes; $out .= str_pad('Section', $this->_maxStringLength + 10); $out .= str_pad("Total Ex Time", 22); $out .= str_pad("Netto Ex Time", 22); $out .= str_pad("#Calls", 10); $out .= "Percentage\n"; $out .= $dashes; } foreach ($informations as $name => $values) { $percentage = $values['percentage']; $calls_str = ""; foreach ($values['calls'] as $key => $val) { if ($calls_str) { $calls_str .= ", "; } $calls_str .= "$key ($val)"; } $callers_str = ""; foreach ($values['callers'] as $key => $val) { if ($callers_str) { $callers_str .= ", "; } $callers_str .= "$key ($val)"; } $percentage = $values['percentage']; if (is_numeric($values['percentage'])) { $percentage .= '%'; } if ($format == 'html') { $out .= ""; $out .= ""; $out .= ""; $out .= ""; $out .= ""; $out .= ""; $out .= ""; } else { $out .= str_pad($name, $this->_maxStringLength + 10); $out .= str_pad($values['time'], 22); $out .= str_pad($values['netto_time'], 22); $out .= str_pad($values['num_calls'], 10); $out .= str_pad($percentage . "\n", 8, ' ', STR_PAD_LEFT); } } if ($format == 'html') { return $out . '
 total ex. timenetto ex. time#calls%callscallers
$name{$values['time']}{$values['netto_time']}{$values['num_calls']}{$percentage}$calls_str$callers_str
'; } else { return $out; } } /** * Returns formatted profiling information. * * @param string $format output format (auto, plain or html), default auto * * @access public * @return void */ function display($format = 'auto') { echo $this->_getOutput($format); } /** * Enters "Global" section. * * @see enterSection(), stop() * @access public * @return void */ function start() { $this->enterSection('Global'); } /** * Leaves "Global" section. * * @see leaveSection(), start() * @access public * @return void */ function stop() { $this->leaveSection('Global'); } /** * Enters code section. * * @param string $name The code section * * @see start(), leaveSection() * @access public * @return void */ function enterSection($name) { if (count($this->_stack)) { $item = end($this->_stack); if (isset($this->_callers[$name][$item["name"]])) { $this->_callers[$name][$item["name"]]++; } else { $this->_callers[$name][$item["name"]] = 1; } if (isset($this->_calls[$item][$name])) { $this->_calls[$item["name"]][$name]++; } else { $this->_calls[$item["name"]][$name] = 1; } } else { if ($name != 'Global') { $msg = "tried to enter section " . $name . " but profiling was not started\n"; $this->raiseError($msg, null, PEAR_ERROR_DIE); } } if (isset($this->_numberOfCalls[$name])) { $this->_numberOfCalls[$name]++; } else { $this->_numberOfCalls[$name] = 1; } $data = array("name" => $name, "time" => $this->_getMicrotime()); array_push($this->_stack, $data); } /** * Leaves code section. * * @param string $name The marker to be set * * @see stop(), enterSection() * @access public * @return void */ function leaveSection($name) { $microtime = $this->_getMicrotime(); if (!count($this->_stack)) { $msg = "tried to leave section " . $name . " but profiling was not started\n"; $this->raiseError($msg, null, PEAR_ERROR_DIE); } $x = array_pop($this->_stack); if ($x["name"] != $name) { $msg = "reached end of section " . $name . " but expecting end of " . $x["name"] . "\n"; $this->raiseError($msg, null, PEAR_ERROR_DIE); } if (isset($this->_sections[$name])) { $this->_sections[$name] += $microtime - $x["time"]; } else { $this->_sections[$name] = $microtime - $x["time"]; } $parent = array_pop($this->_stack); if (isset($parent)) { if (isset($this->_subSectionsTime[$parent['name']])) { $this->_subSectionsTime[$parent['name']] += $microtime - $x['time']; } else { $this->_subSectionsTime[$parent['name']] = $microtime - $x['time']; } array_push($this->_stack, $parent); } } /** * Wrapper for microtime(). * * @return float * @access private * @since 1.3.0 */ function _getMicrotime() { $microtime = explode(' ', microtime()); return $microtime[1] . substr($microtime[0], 1); } } Benchmark-1.2.9/Benchmark/Timer.php000064400000000000000000000250541217731046300171100ustar00rootroot00000000000000. * * This source file is subject to the New BSD license, That is bundled * with this package in the file LICENSE, and is available through * the world-wide-web at * http://www.opensource.org/licenses/bsd-license.php * If you did not receive a copy of the new BSDlicense 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. * * @category Benchmarking * @package Benchmark * @author Sebastian Bergmann * @copyright 2002-2005 Sebastian Bergmann * @license http://www.php.net/license/3_0.txt The PHP License, Version 3.0 * @version CVS: $Id$ * @link http://pear.php.net/package/Benchmark */ require_once 'PEAR.php'; /** * Provides timing and profiling information. * * Example 1: Automatic profiling start, stop, and output. * * * setMarker('Marker 1'); * ?> * * * Example 2: Manual profiling start, stop, and output. * * * start(); * $timer->setMarker('Marker 1'); * $timer->stop(); * * $timer->display(); // to output html formated * // AND/OR : * $profiling = $timer->getProfiling(); // get profiler info as associative array * ?> * * * @category Benchmarking * @package Benchmark * @author Sebastian Bergmann * @author Ludovico Magnocavallo * @copyright 2002-2005 Sebastian Bergmann * @license http://www.php.net/license/3_0.txt The PHP License, Version 3.0 * @link http://pear.php.net/package/Benchmark */ class Benchmark_Timer extends PEAR { /** * Contains the markers. * * @var array * @access private */ var $markers = array(); /** * Auto-start and stop timer. * * @var boolean * @access private */ var $auto = false; /** * Max marker name length for non-html output. * * @var integer * @access private */ var $maxStringLength = 0; /** * Constructor. * * @param boolean $auto Automatically start timer * * @access public */ function Benchmark_Timer($auto = false) { $this->auto = $auto; if ($this->auto) { $this->start(); } $this->PEAR(); } /** * Close method. Stop timer and display output. * * @access public * @return void */ function close() { if ($this->auto) { $this->stop(); $this->display(); } } /** * Set "Start" marker. * * @see setMarker(), stop() * @access public * @return void */ function start() { $this->setMarker('Start'); } /** * Set "Stop" marker. * * @see setMarker(), start() * @access public * @return void */ function stop() { $this->setMarker('Stop'); } /** * Set marker. * * @param string $name Name of the marker to be set. * * @see start(), stop() * @access public * @return void */ function setMarker($name) { $this->markers[$name] = $this->_getMicrotime(); } /** * Returns the time elapsed betweens two markers. * * @param string $start start marker, defaults to "Start" * @param string $end end marker, defaults to "Stop" * * @return double $time_elapsed time elapsed between $start and $end * @access public */ function timeElapsed($start = 'Start', $end = 'Stop') { if ($end == 'Stop' && !isset($this->markers['Stop'])) { $this->markers['Stop'] = $this->_getMicrotime(); } $end = isset($this->markers[$end]) ? $this->markers[$end] : 0; $start = isset($this->markers[$start]) ? $this->markers[$start] : 0; if (extension_loaded('bcmath')) { return bcsub($end, $start, 6); } else { return $end - $start; } } /** * Returns profiling information. * * $profiling[x]['name'] = name of marker x * $profiling[x]['time'] = time index of marker x * $profiling[x]['diff'] = execution time from marker x-1 to this marker x * $profiling[x]['total'] = total execution time up to marker x * * @return array * @access public */ function getProfiling() { $i = $total = 0; $result = array(); $temp = reset($this->markers); $this->maxStringLength = 0; foreach ($this->markers as $marker => $time) { if (extension_loaded('bcmath')) { $diff = bcsub($time, $temp, 6); $total = bcadd($total, $diff, 6); } else { $diff = $time - $temp; $total = $total + $diff; } $result[$i]['name'] = $marker; $result[$i]['time'] = $time; $result[$i]['diff'] = $diff; $result[$i]['total'] = $total; $longer = strlen($marker) > $this->maxStringLength; if ($longer) { $this->maxStringLength = strlen($marker) + 1; } $temp = $time; $i++; } $result[0]['diff'] = '-'; $result[0]['total'] = '-'; $longer = strlen('total') > $this->maxStringLength; if ($longer) { $this->maxStringLength = strlen('total'); } $this->maxStringLength += 2; return $result; } /** * Return formatted profiling information. * * @param boolean $showTotal Optionnaly includes total in output, default no * @param string $format output format (auto, plain or html), default auto * * @return string * @see getProfiling() * @access public */ function getOutput($showTotal = false, $format = 'auto') { if ($format == 'auto') { if (function_exists('version_compare') && version_compare(phpversion(), '4.1', 'ge')) { $format = isset($_SERVER['SERVER_PROTOCOL']) ? 'html' : 'plain'; } else { global $HTTP_SERVER_VARS; $use_html = isset($HTTP_SERVER_VARS['SERVER_PROTOCOL']); $format = $use_html ? 'html' : 'plain'; } } $total = $this->TimeElapsed(); $result = $this->getProfiling(); $dashes = ''; if ($format == 'html') { $out = ''."\n"; $out .= ''; $out .= ''; $out .= ''; $out .= ''; $out .= ''; if ($showTotal) { $out .= ''; $out .= ''; } $out .= "\n"; } else { $dashes = $out = str_pad("\n", $this->maxStringLength + ($showTotal ? 70 : 45), '-', STR_PAD_LEFT); $out .= str_pad('marker', $this->maxStringLength) . str_pad("time index", 22) . str_pad("ex time", 16) . str_pad("perct ", 8) . ($showTotal ? ' '.str_pad("elapsed", 16)."perct" : '')."\n" . $dashes; } foreach ($result as $k => $v) { $perc = (($v['diff'] * 100) / $total); $tperc = (($v['total'] * 100) / $total); $percentage = number_format($perc, 2, '.', '')."%"; if ($format == 'html') { $out .= "". ($showTotal ? "" : ''). "\n"; } else { $out .= str_pad($v['name'], $this->maxStringLength, ' ') . str_pad($v['time'], 22) . str_pad($v['diff'], 14) . str_pad($percentage, 8, ' ', STR_PAD_LEFT) . ($showTotal ? ' '. str_pad($v['total'], 14) . str_pad(number_format($tperc, 2, '.', '')."%", 8, ' ', STR_PAD_LEFT) : ''). "\n"; } $out .= $dashes; } if ($format == 'html') { $out .= ""; $out .= ""; $out .= ""; $out .= ""; $out .= ""; $out .= ($showTotal ? "" : ""); $out .= "\n"; $out .= "
 time indexex time%elapsed%
" . $v['name'] . "" . $v['time'] . "" . $v['diff'] . "" . $percentage . "" . $v['total'] . "" . number_format($tperc, 2, '.', '') . "%
total-${total}100.00%--
\n"; } else { $out .= str_pad('total', $this->maxStringLength); $out .= str_pad('-', 22); $out .= str_pad($total, 15); $out .= "100.00%\n"; $out .= $dashes; } return $out; } /** * Prints the information returned by getOutput(). * * @param boolean $showTotal Optionnaly includes total in output, default no * @param string $format output format (auto, plain or html), default auto * * @see getOutput() * @access public * @return void */ function display($showTotal = false, $format = 'auto') { print $this->getOutput($showTotal, $format); } /** * Wrapper for microtime(). * * @return float * @access private * @since 1.3.0 */ function _getMicrotime() { $microtime = explode(' ', microtime()); return $microtime[1] . substr($microtime[0], 1); } } Benchmark-1.2.9/LICENSE000064400000000000000000000025071217731046300144300ustar00rootroot00000000000000Redistribution and use in source and binary forms, with or without modification , are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, th is list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/ or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WA RRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABIL ITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR C ONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOW EVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILI TY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE U SE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Benchmark-1.2.9/README000064400000000000000000000010171217731046300142760ustar00rootroot00000000000000This package is http://pear.php.net/package/Benchmark and has been migrated from http://svn.php.net/repository/pear/packages/Benchmark Please report all new issues via the PEAR bug tracker. If this package is marked as unmaintained and you have fixes, please submit your pull requests and start discussion on the pear-qa mailing list. To test, run either $ phpunit tests/ or $ pear run-tests -r To build, simply $ pear package To install from scratch $ pear install package.xml To upgrade $ pear upgrade -f package.xml Benchmark-1.2.9/doc/000075500000000000000000000000001217731046300141645ustar00rootroot00000000000000Benchmark-1.2.9/doc/timer_example.php000064400000000000000000000030001217731046300175210ustar00rootroot00000000000000. * * This source file is subject to the New BSD license, That is bundled * with this package in the file LICENSE, and is available through * the world-wide-web at * http://www.opensource.org/licenses/bsd-license.php * If you did not receive a copy of the new BSDlicense 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. * * @category Benchmarking * @package Benchmark * @author Sebastian Bergmann * @copyright 2002-2005 Sebastian Bergmann * @license http://www.php.net/license/3_0.txt The PHP License, Version 3.0 * @version CVS: $Id$ * @link http://pear.php.net/package/Benchmark */ require 'Benchmark/Timer.php'; /** * Wait * * @param int $amount Amount to wait * * @return void */ function wait($amount) { for ($i=0; $i < $amount; $i++) { for ($i=0; $i < 100; $i++) { } } } // Pass the param "true" to constructor to automatically display the results $timer = new Benchmark_Timer(); $timer->start(); wait(10); $timer->setMarker('Mark1'); echo "Elapsed time between Start and Mark1: " . $timer->timeElapsed('Start', 'Mark1') . "\n"; wait(50); $timer->stop(); $timer->display(); package.xml000064400000000000000000000154251217731046300132040ustar00rootroot00000000000000 Benchmark pear.php.net Framework to benchmark PHP scripts or function calls. Framework to benchmark PHP scripts or function calls. Anant Narayanan anant anant@kix.in yes 2011-12-11 1.2.9 1.2.7 stable stable New BSD QA Release Bug #17204 Benchmark_Iterate::run trigger an error of type E_NOTICE Bug #18045 Profiler::enterSection is broken 4.0.0 1.4.0b1 bcmath 1.1.0 1.1.0 stable stable 2002-01-26 New BSD + Added getOutput() to print the results in human readable format and display() to show it. This functions will automatically detect the environment to select HTML or text output. + Added a new parameter $auto to constructor. When TRUE is passed, the results will be output automatically at the end of the script execution. (Contribution by Ludovico Magnocavallo) 1.2.0 1.2.0 stable stable 2002-09-25 New BSD + Added Profiler class. (Contribution by Matthias Englert) 1.2.1 1.2.1 stable stable 2003-05-20 New BSD + Profiler: Added calculation of netto execution time of sections. + Profiler: Optional output to an array instead of screen. (Contributed by Jean-Marc Fontaine) * Profiler: Fixed typos. 1.2.2 1.2.2 stable stable 2005-01-19 New BSD * Fixed bug #1365: _getOutput() table not XHTML complaint. * Fixed bug #2727: Output ist not valid XHTML. Patch by Helgi &THORN;ormar <helgi@trance.is>. * Fixed bug #2295: Timer.php: undefined index "Stop" on line 208. 1.2.3 1.2.3 stable stable 2005-06-11 New BSD Sebastian Bergman devolves the maintainance to Bertrand Gugger on 04/15/2005 * bug #3620 CRITICAL: non-ISO-8859-1 characters in package.xml must be entitied * Profiler + fix comments and fix bug #3369 Profiler : Manual mode generates automatic output + fix bug #2957 zero devision when calling getAllSectionsInformations + CS/WS fixes + Typo in private var _auto use (thanks sascha Eissler) * Timer + Example 2 corrected + Bug #4346 : wrong totals, also potential bug if several sessions (display shift) + The output has been extented to optionnaly display the totals. * Iterate + Request #1160 Feature Addition: Simple Output on Benchmark_Iterate + $GLOBALS[] instead of global $... 1.2.4 1.2.4 stable stable 2005-11-05 New BSD - Change licence to the new BSD License (see http://www.opensource.org/licenses/bsd-license.php) 1.2.6 1.2.6 stable stable 2006-03-02 New BSD - Fixed extra table tag for text input - Formatted text output properly (bug #6972) 1.2.7 1.2.7 stable stable 2007-06-23 New BSD - Make output XHTML compliant (bug #1365) - Fix unknown index error in timeElapsed (bug #2295) - Fix class destructor behaviour on PHP 4 (bug #8748) - Fix documentation strings, add user docs. - Migrated to package2.xml. 1.2.8 1.2.7 stable stable 2010-10-25 New BSD QA release Doc Bug #8596 Called stable without user doc Request #14777 Improve PHPCS results 1.2.9 1.2.7 stable stable 2011-12-11 New BSD QA Release Bug #17204 Benchmark_Iterate::run trigger an error of type E_NOTICE Bug #18045 Profiler::enterSection is broken