Currently, HashBagOStuff leads in most benchmarks, except for the --fill benchmark, where MapCacheLRU is faster on HHVM. (by invoking with `PHP=hhvm mwscript maintenance/bench...`) Run in MediaWiki-Vagrant (Debian Jessie) on MacBook Pro host. $ benchmarkLruHash.php --count 50000 --construct Running PHP 5.6.30-0+deb8u1: - HashBagOStuff-construct (22% faster) total: 446.20ms (min: 0.01ms, median: 0.01ms, max: 2.09ms) - MapCacheLRU-construct total: 575.31ms (min: 0.01ms, median: 0.01ms, max: 3.51ms) Running PHP version 5.6.99-hhvm: - HashBagOStuff-construct (13% faster) total: 124.70ms (min: 0.00ms, median: 0.00ms, max: 1.27ms) - MapCacheLRU-construct total: 143.76ms (min: 0.00ms, median: 0.00ms, max: 2.01ms) For MapCacheLRU, the main slowdown is its use of Wikimedia\Assert. Removing that would make it faster than HashBagOStuff. $ benchmarkLruHash.php --count 3000 --fill Running PHP 5.6.30-0+deb8u1: - HashBagOStuff-fill (22% faster) total: 10196.82ms (min: 2.91ms, median: 3.24ms, max: 9.51ms) - MapCacheLRU-fill total: 13197.13ms (min: 3.92ms, median: 4.31ms, max: 9.90ms) Running PHP version 5.6.99-hhvm: - HashBagOStuff-fill total: 5700.37ms (min: 1.71ms, median: 1.85ms, max: 8.24ms) - MapCacheLRU-fill (11% faster) total: 4986.90ms (min: 1.48ms, median: 1.62ms, max: 6.93ms) Change-Id: Icd03f872dddb308f162c72674c8d2aa6092395e5
97 lines
2.8 KiB
PHP
97 lines
2.8 KiB
PHP
<?php
|
|
/**
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
* http://www.gnu.org/copyleft/gpl.html
|
|
*
|
|
* @file
|
|
* @ingroup Benchmark
|
|
*/
|
|
|
|
require_once __DIR__ . '/Benchmarker.php';
|
|
|
|
/**
|
|
* Maintenance script that benchmarks HashBagOStuff and MapCacheLRU.
|
|
*
|
|
* @ingroup Benchmark
|
|
*/
|
|
class BenchmarkLruHash extends Benchmarker {
|
|
protected $defaultCount = 1000;
|
|
|
|
public function __construct() {
|
|
parent::__construct();
|
|
$this->addDescription( 'Benchmarks HashBagOStuff and MapCacheLRU.' );
|
|
$this->addOption( 'construct', 'Run construct only', false, false );
|
|
$this->addOption( 'fill', 'Run fill only', false, false );
|
|
}
|
|
|
|
public function execute() {
|
|
$exampleKeys = [];
|
|
$max = 100;
|
|
$count = 500;
|
|
while ( $count-- ) {
|
|
$exampleKeys[] = wfRandomString();
|
|
}
|
|
// 1000 keys (1...500, 500...1)
|
|
$keys = array_merge( $exampleKeys, array_reverse( $exampleKeys ) );
|
|
|
|
$fill = $this->hasOption( 'fill' ) || !$this->hasOption( 'construct' );
|
|
$construct = $this->hasOption( 'construct' ) || !$this->hasOption( 'fill' );
|
|
$benches = [];
|
|
|
|
if ( $construct ) {
|
|
$benches['HashBagOStuff-construct'] = [
|
|
'function' => function () use ( $max ) {
|
|
$obj = new HashBagOStuff( [ 'maxKeys' => $max ] );
|
|
},
|
|
];
|
|
$benches['MapCacheLRU-construct'] = [
|
|
'function' => function () use ( $max ) {
|
|
$obj = new MapCacheLRU( $max );
|
|
},
|
|
];
|
|
}
|
|
|
|
if ( $fill ) {
|
|
// For the fill bechmark, ensure object creation is not measured.
|
|
$hObj = null;
|
|
$benches['HashBagOStuff-fill'] = [
|
|
'setup' => function () use ( &$hObj, $max ) {
|
|
$hObj = new HashBagOStuff( [ 'maxKeys' => $max ] );
|
|
},
|
|
'function' => function () use ( &$hObj, &$keys ) {
|
|
foreach ( $keys as $i => $key ) {
|
|
$hObj->set( $key, $i );
|
|
}
|
|
}
|
|
];
|
|
$mObj = null;
|
|
$benches['MapCacheLRU-fill'] = [
|
|
'setup' => function () use ( &$mObj, $max ) {
|
|
$mObj = new MapCacheLRU( $max );
|
|
},
|
|
'function' => function () use ( &$mObj, &$keys ) {
|
|
foreach ( $keys as $i => $key ) {
|
|
$mObj->set( $key, $i );
|
|
}
|
|
}
|
|
];
|
|
}
|
|
|
|
$this->bench( $benches );
|
|
}
|
|
}
|
|
|
|
$maintClass = BenchmarkLruHash::class;
|
|
require_once RUN_MAINTENANCE_IF_MAIN;
|