From 2698d9803df209cb36059c6fed4ac5b9bf1a0051 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Mon, 8 Dec 2014 23:44:00 -0800 Subject: [PATCH] Made SectionProfiler cache the ScopedCallback closure to lower overhead Change-Id: Ia6f2ef4bb82dad13d49e74c730530295d5719009 --- includes/libs/ScopedCallback.php | 8 ++++++-- includes/profiler/SectionProfiler.php | 9 ++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/includes/libs/ScopedCallback.php b/includes/libs/ScopedCallback.php index 631b6519fe..629c26907c 100644 --- a/includes/libs/ScopedCallback.php +++ b/includes/libs/ScopedCallback.php @@ -28,16 +28,20 @@ class ScopedCallback { /** @var callable */ protected $callback; + /** @var array */ + protected $params; /** * @param callable $callback + * @param array $params Callback arguments (since 1.25) * @throws Exception */ - public function __construct( $callback ) { + public function __construct( $callback, array $params = array() ) { if ( !is_callable( $callback ) ) { throw new InvalidArgumentException( "Provided callback is not valid." ); } $this->callback = $callback; + $this->params = $params; } /** @@ -67,7 +71,7 @@ class ScopedCallback { */ function __destruct() { if ( $this->callback !== null ) { - call_user_func( $this->callback ); + call_user_func_array( $this->callback, $this->params ); } } } diff --git a/includes/profiler/SectionProfiler.php b/includes/profiler/SectionProfiler.php index 275e986e07..2c36b68c15 100644 --- a/includes/profiler/SectionProfiler.php +++ b/includes/profiler/SectionProfiler.php @@ -46,6 +46,8 @@ class SectionProfiler { protected $collateOnly = true; /** @var array Cache of a standard broken collation entry */ protected $errorEntry; + /** @var callable Cache of a profile out callback */ + protected $profileOutCallback; /** * @param array $params @@ -53,6 +55,9 @@ class SectionProfiler { public function __construct( array $params = array() ) { $this->errorEntry = $this->getErrorEntry(); $this->collateOnly = empty( $params['trace'] ); + $this->profileOutCallback = function ( $profiler, $section ) { + $profiler->profileOutInternal( $section ); + }; } /** @@ -63,9 +68,7 @@ class SectionProfiler { $this->profileInInternal( $section ); $that = $this; - return new ScopedCallback( function () use ( $that, $section ) { - $that->profileOutInternal( $section ); - } ); + return new ScopedCallback( $this->profileOutCallback, array( $that, $section ) ); } /** -- 2.20.1