さて、今回は「PHPのちょっとしたコツ」の続きネタで、PHP最適化Tipsまとめサイトの紹介です。
これらは既に有名なサイトで紹介されていたり、常識の範囲かもしれませんが、ひとつでも有用に感じていただければ幸いです。
そして英語が極端に苦手なため、意訳突っ込み等あれば宜しくお願い致します。
PHPの最適化 12 PHP Optimization tips
(元ネタはこちらでしょうか? http://www.ilia.ws/files/zend_performance.pdf)
- staticが使えるなら、staticを使う。速度は4倍になる。
- __get, __set, __autoload は避ける。
- require_once() はコストがかかる。
- include や require では絶対パスで指定する。
- スクリプトの開始時間は $_SERVER[’REQUEST_TIME’] で得る。
- 正規表現は、文字列関数で代用できないか探る。(文字を見つけるだけならstrposなどでもよい)
- str_replace は preg_replace より早いが、strtr は str_replace の4倍早い。
- 文字列/配列両方を受け入れる柔軟さを持つ関数は避ける。変わりに個別の関数を用意する。
- @によるエラー制御は遅い
- $row[’id’] は $row[id] より7倍早い
- エラーメッセージはコストがかかる
- for ($x=0; $x < count($array); $x) の count() のようにループの度に呼ばれる関数はさけ、変数に格納する。
また、次のサイトでは実際に色々試した結果が乗っています。
PHP Benchmark test
「echo VS print」「for VS while VS foreach」「ダブルクォート VS シングルクォート」など、素朴な疑問から始まり、実際に計測し結果を公表しています。
ここのサイトでも実証を行っています。
Optimizing PHP Through Habits
- requireはrequire_once()より3-4倍遅い?
- 空ファイルを forループで1万回呼んだ結果、4倍程度早かった。
- __get, __set, __autoload は遅い?
- new Foo() と require_once('foo.php'); new Foo() で試した結果、__autoload() 3.7倍早かった。__getは差が見られなかった。
Optimizing PHP object
主にオブジェクトでのパフォーマンスが記述されています。
概要
- すべての変数は最初に初期化すべき
- メソッドで2回以上参照されるすべてのグローバル/オブジェクト変数はは、ローカル変数に格納したほうがよい。
- よく使うメソッドは派生クラスに定義する。
詳細
- メソッドでのローカル変数のインクリメントがもっとも早い。通常関数でのローカル変数のインクリメントもほぼ同じ。
- グローバル変数のインクリメントはローカル変数のインクリメントより2倍遅い
- オブジェクト変数のインクリメント($this->hoge++)よりローカル変数インクリメント($hoge++)の方が3倍早い
- 未定義の変数のインクリメントよりも、初期化した変数のインクリメントの方が9-10倍早い
- 宣言なしに使われるグローバル変数もローカル変数が増えるのと同じくらいコストがかかる(たぶんPHPはグローバル変数の存在を調べるため)
- クラス内に10以上のメソッドがあってもパフォーマンスは変わらない
- 派生クラスメソッドはスーパークラスメソッドより早い
- 1つの引数と空の関数の呼び出しは、ローカル変数のインクリメント7-8回分のコスト。同じようなメソッドの呼び出しは 15回分のコストがかかる
このTipsはだいぶザックリしたレベルのチューニングですので、お試しになる際は鵜呑みにせずご自身の環境でテストしてみることをおすすめします。
また、もちろんすべてのコードを見直すとなれば非現実的なコストがかかることもあると思います。
必ずこうしなければならないわけではありませんし、「この程度なら…」という場合ももちろんあるかと思いますので、一概には言えません。
もしあなたのサイトのパフォーマンスに不満がある場合、一度見直してみるとか、新たにコードを記述する際にちょっとだけ気をつけてみるという程度で構わないでしょう。