Krinkle has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/368308 )
Change subject: benchmarks: Add benchmarks for MapCacheLRU and HashBagOStuff ...................................................................... benchmarks: Add benchmarks for MapCacheLRU and HashBagOStuff Currently, HashBagOStuff leads in most benchmarks, except for the --fill benchmark, where MapCacheLRU is faster on HHVM. 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 --- A maintenance/benchmarks/benchmarkLruHash.php 1 file changed, 97 insertions(+), 0 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core refs/changes/08/368308/1 diff --git a/maintenance/benchmarks/benchmarkLruHash.php b/maintenance/benchmarks/benchmarkLruHash.php new file mode 100644 index 0000000..1541f82 --- /dev/null +++ b/maintenance/benchmarks/benchmarkLruHash.php @@ -0,0 +1,97 @@ +<?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; -- To view, visit https://gerrit.wikimedia.org/r/368308 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Icd03f872dddb308f162c72674c8d2aa6092395e5 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/core Gerrit-Branch: master Gerrit-Owner: Krinkle <krinklem...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits