description = []; $this->startTime = []; $this->endTime = []; $this->initTime = 0; $this->cur_timer = ""; $this->stack = []; $this->trail = ""; $this->trace = ""; $this->count = []; $this->running = []; $this->initTime = $this->getMicroTime(); $this->output_enabled = $output_enabled; $this->trace_enabled = $trace_enabled; $this->startTimer( 'unprofiled' ); } // Public Methods /** * Start an individual timer * This will pause the running timer and place it on a stack. * @param string $name name of the timer * @param string optional $desc description of the timer */ function startTimer( $name, $desc = "" ) { $this->trace .= "start $name\n"; $n = array_push( $this->stack, $this->cur_timer ); $this->__suspendTimer( $this->stack[$n - 1] ); $this->startTime[$name] = $this->getMicroTime(); $this->cur_timer = $name; $this->description[$name] = $desc; if ( !array_key_exists( $name, $this->count ) ) { $this->count[$name] = 1; } else { $this->count[$name]++; } } /** * Stop an individual timer * Restart the timer that was running before this one * @param string $name name of the timer */ function stopTimer( $name ) { $this->trace .= "stop $name\n"; $this->endTime[$name] = $this->getMicroTime(); if ( !array_key_exists( $name, $this->running ) ) { $this->running[$name] = $this->elapsedTime( $name ); } else { $this->running[$name] += $this->elapsedTime( $name ); } $this->cur_timer = array_pop( $this->stack ); $this->__resumeTimer( $this->cur_timer ); } /** * measure the elapsed time of a timer without stoping the timer if * it is still running * @param $name * @return int|mixed */ function elapsedTime( $name ) { // This shouldn't happen, but it does once. if ( !array_key_exists( $name, $this->startTime ) ) { return 0; } if ( array_key_exists( $name, $this->endTime ) ) { return ( $this->endTime[$name] - $this->startTime[$name] ); } else { $now = $this->getMicroTime(); return ( $now - $this->startTime[$name] ); } }//end start_time /** * Measure the elapsed time since the profile class was initialised * */ function elapsedOverall() { $oaTime = $this->getMicroTime() - $this->initTime; return ( $oaTime ); }//end start_time /** * print out a log of all the timers that were registered * @param bool $enabled */ function printTimers( $enabled = false ) { if ( $this->output_enabled || $enabled ) { $TimedTotal = 0; $tot_perc = 0; ksort( $this->description ); print( "
\n" );
$oaTime = $this->getMicroTime() - $this->initTime;
echo "============================================================================\n";
echo " PROFILER OUTPUT\n";
echo "============================================================================\n";
print( "Calls Time Routine\n" );
echo "-----------------------------------------------------------------------------\n";
foreach ( $this->description as $key => $val ) {
$t = $this->elapsedTime( $key );
if ( isset( $this->running[$key] ) ) {
$total = $this->running[$key];
} else {
$total = 0;
}
$count = $this->count[$key];
$TimedTotal += $total;
$perc = ( $total / $oaTime ) * 100;
$tot_perc += $perc;
// $perc=sprintf("%3.2f", $perc );
printf( "%3d %3.4f ms (%3.2f %%) %s\n", $count, $total * 1000, $perc, $key );
}
echo "\n";
$missed = $oaTime - $TimedTotal;
$perc = ( $missed / $oaTime ) * 100;
$tot_perc += $perc;
// $perc=sprintf("%3.2f", $perc );
printf( " %3.4f ms (%3.2f %%) %s\n", $missed * 1000, $perc, "Missed" );
echo "============================================================================\n";
printf( " %3.4f ms (%3.2f %%) %s\n", $oaTime * 1000, $tot_perc, "OVERALL TIME" );
echo "============================================================================\n";
print( "" );
}
}
/**
* @param bool $enabled
*/
function printTrace( $enabled = false ) {
if ( $this->trace_enabled || $enabled ) {
print( "" ); print( "Trace\n$this->trace\n\n" ); print( "" ); } } /// Internal Use Only Functions /** * Get the current time as accuratly as possible * */ function getMicroTime() { return microtime( true ); } /** * resume an individual timer * @param $name */ function __resumeTimer( $name ) { $this->trace .= "resume $name\n"; $this->startTime[$name] = $this->getMicroTime(); } /** * suspend an individual timer * @param $name */ function __suspendTimer( $name ) { $this->trace .= "suspend $name\n"; $this->endTime[$name] = $this->getMicroTime(); if ( !array_key_exists( $name, $this->running ) ) { $this->running[$name] = $this->elapsedTime( $name ); } else { $this->running[$name] += $this->elapsedTime( $name ); } } } /** * @param $name */ function profiler_start( $name ) { if ( array_key_exists( "midcom_profiler", $GLOBALS ) ) { $GLOBALS["midcom_profiler"]->startTimer( $name ); } } /** * @param $name */ function profiler_stop( $name ) { if ( array_key_exists( "midcom_profiler", $GLOBALS ) ) { $GLOBALS["midcom_profiler"]->stopTimer( $name ); } } ?>