*/
class ProfilerXhprof extends Profiler {
/**
- * @var Xhprof $xhprof
+ * @var XhprofData|null $xhprofData
*/
- protected $xhprof;
+ protected $xhprofData;
/**
* Profiler for explicit, arbitrary, frame labels
* @param array $params
* @see Xhprof::__construct()
*/
- public function __construct( array $params = array() ) {
+ public function __construct( array $params = [] ) {
parent::__construct( $params );
- $this->xhprof = new Xhprof( $params );
+
+ $flags = isset( $params['flags'] ) ? $params['flags'] : 0;
+ $options = isset( $params['exclude'] )
+ ? [ 'ignored_functions' => $params['exclude'] ] : [];
+ Xhprof::enable( $flags, $options );
$this->sprofiler = new SectionProfiler();
}
+ /**
+ * @return XhprofData
+ */
+ public function getXhprofData() {
+ if ( !$this->xhprofData ) {
+ $this->xhprofData = new XhprofData( Xhprof::disable(), $this->params );
+ }
+ return $this->xhprofData;
+ }
+
public function scopedProfileIn( $section ) {
$key = 'section.' . ltrim( $section, '.' );
return $this->sprofiler->scopedProfileIn( $key );
}
public function getFunctionStats() {
- $metrics = $this->xhprof->getCompleteMetrics();
- $profile = array();
+ $metrics = $this->getXhprofData()->getCompleteMetrics();
+ $profile = [];
$main = null; // units in ms
foreach ( $metrics as $fname => $stats ) {
continue;
}
// Convert elapsed times from μs to ms to match interface
- $entry = array(
+ $entry = [
'name' => $fname,
'calls' => $stats['ct'],
'real' => $stats['wt']['total'] / 1000,
'%memory' => isset( $stats['mu'] ) ? $stats['mu']['percent'] : 0,
'min_real' => $stats['wt']['min'] / 1000,
'max_real' => $stats['wt']['max'] / 1000
- );
+ ];
$profile[] = $entry;
if ( $fname === 'main()' ) {
$main = $entry;
$width = 140;
$nameWidth = $width - 65;
$format = "%-{$nameWidth}s %6d %9d %9d %9d %9d %7.3f%% %9d";
- $out = array();
+ $out = [];
$out[] = sprintf( "%-{$nameWidth}s %6s %9s %9s %9s %9s %7s %9s",
'Name', 'Calls', 'Total', 'Min', 'Each', 'Max', '%', 'Mem'
);
* @return array
*/
public function getRawData() {
- return $this->xhprof->getRawData();
+ return $this->getXhprofData()->getRawData();
}
}