- $this->addDescription( "Makes several 'set', 'incr' and 'get' requests on every"
- . " memcached server and shows a report" );
+ $this->addDescription(
+ "Makes several operation requests on every cache server and shows a report.\n" .
+ "This tests both per-key and batched *Multi() methods as well as WRITE_BACKGROUND.\n" .
+ "\"IB\" means \"immediate blocking\" and \"DB\" means \"deferred blocking.\""
+ );
$this->addOption( 'i', 'Number of iterations', false, true );
$this->addOption( 'cache', 'Use servers from this $wgObjectCaches store', false, true );
$this->addOption( 'driver', 'Either "php" or "pecl"', false, true );
$this->addOption( 'i', 'Number of iterations', false, true );
$this->addOption( 'cache', 'Use servers from this $wgObjectCaches store', false, true );
$this->addOption( 'driver', 'Either "php" or "pecl"', false, true );
+ $mccByServer[$server]->get( 'key' );
+ }
+ $this->output( "done\n" );
+ $this->output( "Single and batched operation profiling/test results:\n" );
+
+ $valueByKey = [];
+ for ( $i = 1; $i <= $iterations; $i++ ) {
+ $valueByKey["test$i"] = 'S' . str_pad( $i, 2048 );
+ }
- $this->benchmarkSingleKeyOps( $mcc, $iterations );
- $this->benchmarkMultiKeyOpsImmediateBlocking( $mcc, $iterations );
- $this->benchmarkMultiKeyOpsDeferredBlocking( $mcc, $iterations );
+ foreach ( $mccByServer as $server => $mcc ) {
+ $this->output( str_pad( $server, $maxSrvLen ) . "\n" );
+ $this->benchmarkSingleKeyOps( $mcc, $valueByKey );
+ $this->benchmarkMultiKeyOpsImmediateBlocking( $mcc, $valueByKey );
+ $this->benchmarkMultiKeyOpsDeferredBlocking( $mcc, $valueByKey );
- " add: $add/$iterations {$addMs}ms " .
- "set: $set/$iterations {$setMs}ms " .
- "incr: $incr/$iterations {$incrMs}ms " .
- "get: $get/$iterations ({$getMs}ms) " .
- "delete: $delete/$iterations ({$delMs}ms)\n"
+ " add: $add/$i {$addMs}ms " .
+ "set: $set/$i {$setMs}ms " .
+ "incr: $incr/$i {$incrMs}ms " .
+ "get: $get/$i ({$getMs}ms) " .
+ "delete: $delete/$i ({$delMs}ms)\n"
- private function benchmarkMultiKeyOpsImmediateBlocking( $mcc, $iterations ) {
- $keysByValue = [];
- for ( $i = 1; $i <= $iterations; $i++ ) {
- $keysByValue["test$i"] = 'S' . str_pad( $i, 2048 );
- }
- $keyList = array_keys( $keysByValue );
+ private function benchmarkMultiKeyOpsImmediateBlocking( BagOStuff $mcc, array $valueByKey ) {
+ $keys = array_keys( $valueByKey );
+ $iterations = count( $valueByKey );
$mGetMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
$mGetOk = 0;
foreach ( $found as $key => $value ) {
$mGetMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
$mGetOk = 0;
foreach ( $found as $key => $value ) {
$mChangeTTTMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
$time_start = microtime( true );
$mChangeTTTMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
$time_start = microtime( true );
- private function benchmarkMultiKeyOpsDeferredBlocking( $mcc, $iterations ) {
+ private function benchmarkMultiKeyOpsDeferredBlocking( BagOStuff $mcc, array $valueByKey ) {
+ $keys = array_keys( $valueByKey );
+ $iterations = count( $valueByKey );
$mGetMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
$mGetOk = 0;
foreach ( $found as $key => $value ) {
$mGetMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
$mGetOk = 0;
foreach ( $found as $key => $value ) {
$mChangeTTTMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
$time_start = microtime( true );
$mChangeTTTMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
$time_start = microtime( true );