記事一覧

PHPで文字列置換関数のパフォーマンスを比較してみた




目次



本記事を書いた時点でのPHPの最新バージョンは、PHP5.6です。

文字列置換の方法いろいろ

ハロー、みなさん。エジソンです。

先日、SimpleXMLの子要素追加時に &(アンパサンド) が含まれる場合にはエラーになってしまうことをお伝えしました。そのためSimpleXMLの子要素追加時は、 & → & というように、文字変換が必要です。

Related Posts

PHPでSimpleXMLに &(アンパサンド) を渡すとエラーになる件



PHPには、文字列置換の関数が色々あるので、何を使って良いやら迷ってしまいますよね。とりあえずの、メジャーどころとしてはstr_replace関数ですが、他にも色々あるので、各種関数のパフォーマンスを比較してみました。

文字列置換のパフォーマンス比較

PHPの文字列置換は以下があります。PHPの公式サイトへのリンクを貼り付けておきましたので、詳細を知りたい方はクリックしてみてください。


htmlspecialcharsは、文字列置換というよりはエスケープ関数なんですが、 & → & に変換可能な関数なので、候補として挙げさせてもらいました。

パフォーマンス測定コード
<?php
$str = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()-^\\=~|@[;:],./`{+*}<>?_';

/*
 * htmlspecialchars
 */
$startTime = microtime(true);
for ($i = 0; $i < 1000; $i++) {
    $conv = htmlspecialchars($str);
}
echo "htmlspecialchars elapsed time : " . sprintf("%.6F", (microtime(true) - $startTime)) . PHP_EOL;

/*
 * str_replace
 */
$startTime = microtime(true);
for ($i = 0; $i < 1000; $i++) {
    $conv = str_replace('&', '&', $str);
}
echo "     str_replace elapsed time : " . sprintf("%.6F", (microtime(true) - $startTime)) . PHP_EOL;

/*
 * strtr
 */
$startTime = microtime(true);
for ($i = 0; $i < 1000; $i++) {
    $conv = strtr($str, array('&' => '&'));
}
echo "           strtr elapsed time : " . sprintf("%.6F", (microtime(true) - $startTime)) . PHP_EOL;

/*
 * preg_replace
 */
$startTime = microtime(true);
for ($i = 0; $i < 1000; $i++) {
    $conv = preg_replace('/&/', '&', $str);
}
echo "    preg_replace elapsed time : " . sprintf("%.6F", (microtime(true) - $startTime)) . PHP_EOL;
?>

結果
htmlspecialchars elapsed time : 0.000797
     str_replace elapsed time : 0.000339
           strtr elapsed time : 0.012981
    preg_replace elapsed time : 0.000773

速度の速い順に並び替えると以下のようになりました。

  1. str_replace
  2. preg_replace
  3. htmlspecialchars
  4. strtr

文字列置換で最もポピュラーな、str_replaceが一番高速でした。

他のサイトで、strtrが一番高速であるという記事も見かけたのですが、str_replaceが一番高速でstrtrが一番低速であるという結果となりました。

htmlspecialcharsは、そもそも複数の文字をエスケープする用途で使われるので、他の関数より若干低速でも納得できますね。

まとめ

文字列置換の方法は様々です。最も基本的な方法には、str_replaceを用いられます。また、html文字をエスケープしたい時にはhtmlspecialcharsを使い、正規表現を使いたい時には、preg_replaceを使うと良いでしょう。

シチュエーションに応じて、適切な文字列置換関数を用いることが重要ですが、パフォーマンスが求められるようなコアな処理を書く場合においては、本記事のコードを参考にして、何を使うべきかを考えていただけると良いかなと思います。


関連記事

このエントリーをはてなブックマークに追加

コメント

コメントの投稿

非公開コメント

プロフィール

EZOLABブログへようこそ。
EZOLABは、札幌のソフトウェア会社です。

http://ezolab.co.jp