From: Timo Tijhof Date: Sat, 31 Aug 2019 21:38:42 +0000 (+0100) Subject: objectcache: Optimise array_map in MemcachedBagOStuff::makeKey() X-Git-Tag: 1.34.0-rc.0~431^2 X-Git-Url: http://git.cyclocoop.org/%22%20.%20generer_url_ecrire%28%22sites_tous%22%29%20.%20%22?a=commitdiff_plain;h=e0d817b7f6a58875782f31bb025a9df5c3ac2a33;p=lhc%2Fweb%2Fwiklou.git objectcache: Optimise array_map in MemcachedBagOStuff::makeKey() This can get called a lot on an average page load, optimise a bit by using a referenced foreach iteration instead. Using a simplified test case, I found this saves about 70% on PHP 7.2. For 100 iterations, from ~1.5ms to ~0.4 ms. ```lang=php $args = [ 'FooBar', 'thisthat', 4, 'foo', 12 ]; $left = 100; foreach ($args as &$arg) { $arg = strtr( $arg, ' ', '_' ); if ( strlen( $arg ) < $left || true ) { $arg = '#' . $arg; } $left--; } ``` Change-Id: Ie779c4661306a6d3dc08c08671f1a36682ca1afb --- diff --git a/includes/libs/objectcache/MemcachedBagOStuff.php b/includes/libs/objectcache/MemcachedBagOStuff.php index dc409315f8..40f283621d 100644 --- a/includes/libs/objectcache/MemcachedBagOStuff.php +++ b/includes/libs/objectcache/MemcachedBagOStuff.php @@ -49,29 +49,25 @@ abstract class MemcachedBagOStuff extends MediumSpecificBagOStuff { // custom prefixes used by thing like WANObjectCache, limit to 205. $charsLeft = 205 - strlen( $keyspace ) - count( $args ); - $args = array_map( - function ( $arg ) use ( &$charsLeft ) { - $arg = strtr( $arg, ' ', '_' ); + foreach ( $args as &$arg ) { + $arg = strtr( $arg, ' ', '_' ); - // Make sure %, #, and non-ASCII chars are escaped - $arg = preg_replace_callback( - '/[^\x21-\x22\x24\x26-\x39\x3b-\x7e]+/', - function ( $m ) { - return rawurlencode( $m[0] ); - }, - $arg - ); + // Make sure %, #, and non-ASCII chars are escaped + $arg = preg_replace_callback( + '/[^\x21-\x22\x24\x26-\x39\x3b-\x7e]+/', + function ( $m ) { + return rawurlencode( $m[0] ); + }, + $arg + ); - // 33 = 32 characters for the MD5 + 1 for the '#' prefix. - if ( $charsLeft > 33 && strlen( $arg ) > $charsLeft ) { - $arg = '#' . md5( $arg ); - } + // 33 = 32 characters for the MD5 + 1 for the '#' prefix. + if ( $charsLeft > 33 && strlen( $arg ) > $charsLeft ) { + $arg = '#' . md5( $arg ); + } - $charsLeft -= strlen( $arg ); - return $arg; - }, - $args - ); + $charsLeft -= strlen( $arg ); + } if ( $charsLeft < 0 ) { return $keyspace . ':BagOStuff-long-key:##' . md5( implode( ':', $args ) );