Made SectionProfiler cache the ScopedCallback closure to lower overhead
authorAaron Schulz <aschulz@wikimedia.org>
Tue, 9 Dec 2014 07:44:00 +0000 (23:44 -0800)
committerBryanDavis <bdavis@wikimedia.org>
Tue, 9 Dec 2014 23:40:35 +0000 (23:40 +0000)
Change-Id: Ia6f2ef4bb82dad13d49e74c730530295d5719009

includes/libs/ScopedCallback.php
includes/profiler/SectionProfiler.php

index 631b651..629c269 100644 (file)
 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 );
                }
        }
 }
index 275e986..2c36b68 100644 (file)
@@ -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 ) );
        }
 
        /**