benchmarker: Implement setupEach for per-iteration setup
authorKunal Mehta <legoktm@member.fsf.org>
Mon, 20 Aug 2018 07:21:49 +0000 (00:21 -0700)
committerKunal Mehta <legoktm@member.fsf.org>
Mon, 20 Aug 2018 07:22:08 +0000 (00:22 -0700)
To bypass caches in legacy code where injection doesn't easily work,
support a per-iteration setup function, 'setupEach', which runs right
before the actual function is timed and called.

And use it in benchmarkTitleValue, where I mistakenly assumed that
'setup' did what I wanted.

Bug: T201992
Change-Id: I2d01d899bf63576df2833705667f1a16604ab4cc

maintenance/benchmarks/Benchmarker.php
maintenance/benchmarks/benchmarkTitleValue.php

index 9bfebce..1559ee9 100644 (file)
@@ -94,6 +94,10 @@ abstract class Benchmarker extends Maintenance {
                        // Run benchmarks
                        $stat = new RunningStat();
                        for ( $i = 0; $i < $count; $i++ ) {
+                               // Setup outside of time measure for each loop
+                               if ( isset( $bench['setupEach'] ) ) {
+                                       $bench['setupEach']();
+                               }
                                $t = microtime( true );
                                call_user_func_array( $bench['function'], $bench['args'] );
                                $t = ( microtime( true ) - $t ) * 1000;
index c60f4bb..6bd7953 100644 (file)
@@ -83,14 +83,22 @@ class BenchmarkTitleValue extends Benchmarker {
                        [
                                'function' => [ $this, 'getPrefixedTextTitle' ],
                        ],
-                       [
+                       'parseTitleValue cached' => [
                                'function' => [ $this, 'parseTitleValue' ],
                                'setup' => [ $this, 'randomize' ],
                        ],
-                       [
+                       'parseTitle cached' => [
                                'function' => [ $this, 'parseTitle' ],
                                'setup' => [ $this, 'randomize' ],
                        ],
+                       'parseTitleValue no cache' => [
+                               'function' => [ $this, 'parseTitleValue' ],
+                               'setupEach' => [ $this, 'randomize' ],
+                       ],
+                       'parseTitle no cache' => [
+                               'function' => [ $this, 'parseTitle' ],
+                               'setupEach' => [ $this, 'randomize' ],
+                       ],
                ] );
        }