str_replace は strtr よりも速度が速かった(PHP)

str_replace と strtr

PHP の strtr() は、str_replace() より速いって言われることがある。

確かに、昔、おいらが計測した時には、strtr() の方が速かったはず。

だが、こちらの方の記事では、「そうでもない」と言っている。
strtrとstr_replaceの処理速度検証 | Fujitaiju Blog

なので、おいらも PHP5.3 と PHP5.6 で計測しなおしてみた。

どんな条件で何回やっても、str_replace() の方が速かった

PHP: strtr – Manual にも書いてある通り、strtr() が最大の真価を発揮するのは、
すべてのキーが同じ長さの場合 である。

なので、まず、この条件でやってみる。

全てのキーが同じ長さの場合

・文字列('abcde')を配列に 10 万件 ぶっ込む
$before = array();
$after = array();
for( $i = 0; 100000 > $i; $i++ ) {
    $before[] = 'abcde';
}

strtr()

・strtr() で、'abcde' を '12345' に置換する
foreach( $before as $value ) {
    $after[] = strtr( $value, 'abcde', '12345' );
}

0.0570030212 sec(平均:0.057 ~ 0.061 sec)

何度やっても、0.057 sec の壁が破れない。

str_replace()

・str_replace() で、'abcde' を '12345' に置換する
foreach( $before as $value ) {
    $after[] = str_replace( 'abcde', '12345', $value );
}

0.0540039539 sec(平均:0.054 ~ 0.059 sec)

たまに、strtr() に負けるが、平均では str_replace() の方が速い。

キーと値を任意の長さにした場合

strtr() は、引数を配列にして、二つだけ渡した場合、キーと値を任意の長さにして、
str_replace() とほぼ同等のことができるようになる。

なので、このパターンを検証してみる。

strtr()

・strtr() で、'abcde' を '123456789' に置換する
$replace = array( 'abcde' => '123456789' );
foreach( $before as $value ) {
     $after[] = strtr( $value, $replace );
}

0.3850221634 sec(平均:0.385 ~ 0.396 sec)

遅っそ・・・ (´Д`)

str_replace()

・str_replace() で、'abcde' を '123456789' に置換する
foreach( $before as $value ) {
    $after[] = str_replace( 'abcde', '123456789', $value );
}

0.0531030727 sec(平均:0.053 ~ 0.062 sec)

strtr() より、約7~8倍 速い!

検証結果

全てのキーが同じ長さなら、ほとんど差がないが、むしろ str_replace() の方が微妙に速かった。

キーと値の長さが違う場合、全く比較にならないほど、str_replace() の方が速かった。

この検証結果だけで見れば、strtr() を使う理由が見当たらなくなるw

ただ、PHP は、バージョンアップを繰り返すごとに、関数も最適化されてきたので、
今後のバージョンアップで、strtr() も盛り返してくるかもしれない。

でも、現在の PHP(5.3~5.6)だと、str_replace() の方が速いっぽい。

最近、GitHub に、こんな投稿もあったが、
php最適化テクニカル · GitHub

strtr() が4倍速いとか、ありえん・・・

書き換えた方がええんちゃう?

IT・ICT

Posted by るな