« 英語版サービスをリリースする前に | メイン | オフィスを移転しました »
2008年05月09日
「@」でエラー抑制すると PHP が遅くなるという噂について
PHP では @ を付けることでエラーを回避できるという便利な記述方法があり、ものぐさな私などは
if (@$var["foo"]) $result = $var["foo"];
みたいなコードを書いてしまいます。
で、この処理が「遅い」という噂やツッコミを度々受けるので調べてみました。
「ほら、そんな気にするほどでも無いよ」という結果を期待していたのですが、、、なんじゃこりゃ。。。
劇遅じゃないですか、これ。
いやはや・・・
ちょっと列挙しますね。以下のようなコードを単純 for 文で 100万回実行したときの結果です。
error_reporting(0) で PHP4
if (@$a["hoge"]) $b = $a["hoge"];⇒ 約 2.4 秒
if ($a["hoge"]) $b = $a["hoge"];⇒ 約 1.3 秒
if (isset($a["hoge"])) $b = $a["hoge"];⇒ 約 0.57 秒
※いずれの場合も、$a = array("a" => "b") であり、if 文は必ず false になります
error_reporting(0xffff) で PHP4
if (@$a["hoge"]) $b = $a["hoge"];⇒ 約 2.4 秒
if (isset($a["hoge"])) $b = $a["hoge"];⇒ 約 0.57 秒
error_reporting(0) で PHP5
if (@$a["hoge"]) $b = $a["hoge"];⇒ 約 4.8 秒
if ($a["hoge"]) $b = $a["hoge"];⇒ 約 4.2 秒
if (isset($a["hoge"])) $b = $a["hoge"];⇒ 約 0.90 秒
error_reporting(0xffff) で PHP5
if (@$a["hoge"]) $b = $a["hoge"];⇒約 9.6 秒
if (isset($a["hoge"])) $b = $a["hoge"];⇒ 約 0.92 秒
※PHP5 のマシンは Dual Core Xeon と高スペックだったので 1000万回の実行時間です。
・・・遅い・・・遅すぎる・・・ここまでパフォーマンス悪くなるとは・・・
細かい処理とはいえ、最大10倍違うわけですから・・・
すいません、完全なる私の敗北です。これからはちゃんと isset() とか死ぬほど使います (_o_)
投稿者 aka : 2008年05月09日 15:55 / 2008年05月 / 開発系
トラックバック
このエントリーのトラックバックURL:
http://133.242.136.64/mt-tb-sf.cgi/684
コメント
こういうのってベンチマークもいいけど,原理的になんで遅くなるのかを解明して説明した方がいいと思いますけどね.
投稿者 hoge : 日時 2008年05月11日 16:16
へー。
俺も見直そう・・・
投稿者 m : 日時 2008年05月11日 18:16
トラックワードが落ちてますよー
投稿者 ほいほい : 日時 2008年05月21日 16:19