処理速度最適化法
いろいろ纏めようと思っていたんですが、すでに分かりやすいサイトが沢山あります。
PHP最適化tipsまとめサイト
基礎構文処理速度のあれこれ
require VS require_once
実際に計測してみた所、試行回数が少なかったせいか、あまり差は見られませんでした。
(未読ファイルの読み込みに関して)
一度しか読まないのが分かっていればrequire_onceを使うメリットはないと思います。
速度は気にせず以下で使い分ければOK。
複数回読まれる可能性があるが、一度しか読む必要がない。require_once
それ以外。require
== VS ===
型を含めて比較する後者の方が若干速い。
パスワードなど外部データと比較する場合にセキュリティーホールとなる可能性があるので、理由がない限り===を常用する。
is_hoge() VS ===
-
if($var===null) {}
後者が速い。
count($array)>0 VS (bool)$array
配列に要素があるかどうかの判別。
後者が速い。
array_merge() VS +演算子
array_mergeは連結後に数字キーを振り直すので、連想配列の場合は+演算子を使った方が速い。
バージョン分岐
PHPのメジャーバージョンで分岐したい場合はversion_compare()を使うより各バージョン特有の定数を調べるのが良い。
-
// PHP_VERSIONの一文字目を調べるより速い
is_file() VS file_exists()
file_exists()はディレクトリも含まれるので、ファイルの有無を調べたいだけならis_file()の方が高速。
文字列連結速度
-
$str = $str1.$str2;
-
$str = "$str1$str2";
-
$str = "{$str1}{$str2}";
上から順に高速。
splitは使うな
文字列を分割して配列を作成する場合、splitは遅いので避ける。
正規表現分割は、 preg_split (PHP 3.0.9, 4, 5)
固定文字分割は、 explode (PHP 3, 4, 5)
分割して一部分だけ取得したい場合は、分割数を制限する3番目のlimit引数を付けておきます。 特にループ内で繰り返し使う場合、全分割するより時間を短縮できます。
time()を何度も呼ばない
何度も使う場合は定数にするなりして使い回す。(2回だけなら定数化しない方が速いかもしれないが。)PHP5では$_SERVER['REQUEST_TIME'];でも可能。
in_array()よりisset()
調べたい要素が複数ある、又は複数回調べたい、それが空文字以外の文字や整数(つまりキーになりうる)で重複していない(整数1と文字'1'は重複)事が確かならarray_flip()で反転させてキーで調べると速い。
array_key_exists()よりisset()
配列の要素がnullの場合両者の挙動が異なります。
それでも影響がない場面ではisset()を使った方が速い。
大文字小文字変換
大文字変換 strtoupper();
小文字変換 strtolower();
速度は変換数に比例して遅くなる。
-
$s = 'aaaaaAaaaaAaaaaaa';
-
// 大文字が少ない分strtolower($s);よりstrtoupper($s);の方が時間がかかる。
まとめ
関数を使わずに済むならその方が高速。
正規表現を使わずに済むならその方が高速。
その他、同様の役割でも何かしらの判断基準が設けられている場合は、そちらの方が遅くなる傾向にあります。
また、計算式では誤差が生じたり可読性が落ちるのでキャストは使わずにintvalなどの変換関数を用いる。状況に応じて速度と手間と可読性のどれを重視するか判断しましょう。