* Made the profiler work in HipHop:

** Don't try to set a global variable in the same file as a class definition (Profiler.php). Set it in WebStart.php instead.
** In StartProfiler.sample, don't use require_once() to get ProfilerStub.

* Removed the setproctitle() stuff from ProfilerStub, the extension is not maintained and doesn't work with Apache 2.x
* Added an optimisation to wfProfileIn() and wfProfileOut() to reduce the overhead when profiling is not enabled
* Added the ability to configure in StartProfiler.php whether CPU time or wall-clock time is used, avoiding recompilation
This commit is contained in:
Tim Starling 2011-05-31 06:05:05 +00:00
parent c00d63dda3
commit a0123d0549
4 changed files with 30 additions and 73 deletions

View file

@ -1,10 +1,8 @@
<?php
require_once( dirname( __FILE__ ) . '/includes/profiler/ProfilerStub.php' );
/**
* To use a profiler, copy this file to StartProfiler.php,
* delete the PHP line above, and add something like this:
* and add something like this:
*
* $wgProfiler['class'] = 'Profiler';
*

View file

@ -81,17 +81,19 @@ if ( isset( $_SERVER['MW_COMPILED'] ) ) {
# Start the autoloader, so that extensions can derive classes from core files
require_once( "$IP/includes/AutoLoader.php" );
# Start profiler
# @todo FIXME: Rewrite wfProfileIn/wfProfileOut so that they can work in compiled mode
# Load the profiler
require_once( "$IP/includes/profiler/Profiler.php" );
if ( file_exists( "$IP/StartProfiler.php" ) ) {
require_once( "$IP/StartProfiler.php" );
}
# Load up some global defines.
require_once( "$IP/includes/Defines.php" );
}
# Start the profiler
$wgProfiler = array();
if ( file_exists( "$IP/StartProfiler.php" ) ) {
require( "$IP/StartProfiler.php" );
}
wfProfileIn( 'WebStart.php-conf' );
# Load default settings

View file

@ -7,21 +7,15 @@
* This file is only included if profiling is enabled
*/
/**
* Default profiling configuration. Permitted keys are:
* class : Name of Profiler or subclass to use for profiling
* visible : Whether to output the profile info [ProfilerSimpleText only]
*/
$wgProfiler = array(
'class' => 'ProfilerStub',
);
/**
* Begin profiling of a function
* @param $functionname String: name of the function we will profile
*/
function wfProfileIn( $functionname ) {
Profiler::instance()->profileIn( $functionname );
global $wgProfiler;
if ( isset( $wgProfiler['class'] ) ) {
Profiler::instance()->profileIn( $functionname );
}
}
/**
@ -29,7 +23,10 @@ function wfProfileIn( $functionname ) {
* @param $functionname String: name of the function we have profiled
*/
function wfProfileOut( $functionname = 'missing' ) {
Profiler::instance()->profileOut( $functionname );
global $wgProfiler;
if ( isset( $wgProfiler['class'] ) ) {
Profiler::instance()->profileOut( $functionname );
}
}
/**
@ -40,11 +37,12 @@ class Profiler {
var $mStack = array (), $mWorkStack = array (), $mCollated = array ();
var $mCalls = array (), $mTotals = array ();
var $mTemplated = false;
var $mTimeMetric = 'wall';
private $mCollateDone = false;
protected $mProfileID = false;
private static $__instance = null;
function __construct() {
function __construct( $params ) {
// Push an entry for the pre-profile setup time onto the stack
global $wgRequestTime;
if ( !empty( $wgRequestTime ) ) {
@ -53,6 +51,9 @@ class Profiler {
} else {
$this->profileIn( '-total' );
}
if ( isset( $params['timeMetric'] ) ) {
$this->mTimeMetric = $params['timeMetric'];
}
}
/**
@ -63,14 +64,13 @@ class Profiler {
if( is_null( self::$__instance ) ) {
global $wgProfiler;
if( is_array( $wgProfiler ) ) {
$class = $wgProfiler['class'];
$class = isset( $wgProfiler['class'] ) ? $wgProfiler['class'] : 'ProfilerStub';
self::$__instance = new $class( $wgProfiler );
} elseif( $wgProfiler instanceof Profiler ) {
self::$__instance = $wgProfiler; // back-compat
} else {
self::$__instance = new ProfilerStub;
}
}
return self::$__instance;
}
@ -253,8 +253,11 @@ class Profiler {
}
function getTime() {
return microtime(true);
#return $this->getUserTime();
if ( $this->mTimeMetric === 'user' ) {
return $this->getUserTime();
} else {
return microtime(true);
}
}
function getUserTime() {
@ -474,7 +477,7 @@ class Profiler {
* @param $s String to output
*/
function debug( $s ) {
if( function_exists( 'wfDebug' ) ) {
if( defined( 'MW_COMPILED' ) || function_exists( 'wfDebug' ) ) {
wfDebug( $s );
}
}

View file

@ -5,57 +5,11 @@
* @ingroup Profiler
*/
class ProfilerStub extends Profiler {
/**
* is setproctitle function available?
* @var bool
*/
private $haveProctitle;
private $hackWhere = array();
/**
* Constructor. Check for proctitle.
*/
public function __construct() {
$this->haveProctitle = function_exists( 'setproctitle' );
}
public function isStub() {
return true;
}
/**
* Begin profiling of a function
* @param $fn string
*/
public function profileIn( $fn ) {
global $wgDBname;
if( $this->haveProctitle ){
$this->hackWhere[] = $fn;
setproctitle( $fn . " [$wgDBname]" );
}
}
/**
* Stop profiling of a function
* @param $fn string
*/
public function profileOut( $fn ) {
global $wgDBname;
if( !$this->haveProctitle ) {
return;
}
if( count( $this->hackWhere ) ) {
array_pop( $this->hackWhere );
}
if( count( $this->hackWhere ) ) {
setproctitle( $this->hackWhere[count( $this->hackWhere )-1] . " [$wgDBname]" );
}
}
/**
* Does nothing, just for compatibility
*/
public function profileIn( $fn ) {}
public function profileOut( $fn ) {}
public function getOutput() {}
public function close() {}
}