Follow up r75429 : benchmark for wfIsWindows();
authorAntoine Musso <hashar@users.mediawiki.org>
Tue, 26 Oct 2010 17:21:35 +0000 (17:21 +0000)
committerAntoine Musso <hashar@users.mediawiki.org>
Tue, 26 Oct 2010 17:21:35 +0000 (17:21 +0000)
Also implements a basic class to build new benchmarks.

maintenance/benchmarks/Benchmarker.php [new file with mode: 0644]
maintenance/benchmarks/bench_wfIsWindows.php [new file with mode: 0644]

diff --git a/maintenance/benchmarks/Benchmarker.php b/maintenance/benchmarks/Benchmarker.php
new file mode 100644 (file)
index 0000000..9149ea2
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Create a doxygen subgroup of Maintenance for benchmarks
+ * @defgroup Benchmark
+ * @ingroup Maintenance
+ */
+
+/**
+ * TODO: report PHP version, OS ..
+ * @file
+ * @ingroup Benchmark
+ */
+
+require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
+abstract class Benchmarker extends Maintenance {
+       private $results;
+
+       public function __construct() {
+               parent::__construct();
+               $this->addOption( 'count', "How many time to run a benchmark", false, true );
+       }
+
+       public function bench( array $benchs ) {
+               $bench_number = 0;
+               $count = $this->getOption( 'count' );
+
+               foreach( $benchs as $bench ) {
+                       // handle empty args
+                       if(!array_key_exists( 'args', $bench )) {
+                               $bench['args'] = array();
+                       }
+
+                       $bench_number++;
+                       $start = wfTime();
+                       for( $i=0; $i<$count; $i++ ) {
+                               call_user_func_array( $bench['function'], $bench['args'] );
+                       }
+                       $delta = wfTime() - $start;
+
+                       // function passed as a callback
+                       if( is_array( $bench['function'] ) ) {
+                               $ret = get_class( $bench['function'][0] ). '->' . $bench['function'][1];
+                               $bench['function'] = $ret;
+                       }
+
+                       $this->results[$bench_number] = array(
+                               'function'  => $bench['function'],
+                               'arguments' => $bench['args'], 
+                               'count'     => $count,
+                               'delta'     => $delta,
+                               'average'   => $delta / $count,
+                               );
+               }
+       }
+
+       public function getFormattedResults( ) {
+               $ret = '';
+               foreach( $this->results as $res ) {
+                       // show function with args
+                       $ret .= sprintf( "%s times: function %s(%s) :\n",
+                               $res['count'],
+                               $res['function'],
+                               join( ', ', $res['arguments'] )
+                       );
+                       $ret .= sprintf( "   %6.2fms (%6.2fms each)\n",
+                               $res['delta']   * 1000,
+                               $res['average'] * 1000
+                       );
+               }
+               return $ret;
+       }
+}
diff --git a/maintenance/benchmarks/bench_wfIsWindows.php b/maintenance/benchmarks/bench_wfIsWindows.php
new file mode 100644 (file)
index 0000000..c729206
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+/**
+ * This come from r75429 message
+ * @author Platonides 
+ */
+
+require_once( dirname( __FILE__ ) . '/Benchmarker.php' );
+class bench_wfIsWindows extends Benchmarker {
+
+       public function __construct() {
+               parent::__construct();  
+       }
+
+       public function execute() {
+               $this->bench( array(
+                       array( 'function' => array( $this, 'wfIsWindows' ) ),
+                       array( 'function' => array( $this, 'wfIsWindowsCached' ) ),
+               ));
+               print $this->getFormattedResults();
+       }
+
+       static function is_win() {
+               return substr( php_uname(), 0, 7 == 'Windows' );
+       }
+
+       // bench function 1
+       function wfIsWindows() {
+               if( self::is_win() ) {
+                       return true;
+               } else {
+                       return false;
+               }
+       }
+
+       // bench function 2
+       function wfIsWindowsCached() {
+               static $isWindows = null;
+               if( $isWindows == null ) {
+                       $isWindows = self::is_win();
+               }
+               return $isWindows;
+       }
+}
+
+$maintClass = 'bench_wfIsWindows';
+require_once( DO_MAINTENANCE );