PHP最適化tipsまとめサイト
Tweet
こんにちは。親知らずを抜いて離乳食三昧のyukiです。GWの暴飲暴食から脱し、ダイエットするには好都合ですね。すいません。負け惜しみです。
さて、今回は「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はだいぶザックリしたレベルのチューニングですので、お試しになる際は鵜呑みにせずご自身の環境でテストしてみることをおすすめします。
また、もちろんすべてのコードを見直すとなれば非現実的なコストがかかることもあると思います。
必ずこうしなければならないわけではありませんし、「この程度なら…」という場合ももちろんあるかと思いますので、一概には言えません。
もしあなたのサイトのパフォーマンスに不満がある場合、一度見直してみるとか、新たにコードを記述する際にちょっとだけ気をつけてみるという程度で構わないでしょう。

コメント
良いまとめですね。非常に参考になりました。
ありがとうございます。
投稿者: Yamada | 2007年5月14日 11:33
コメントありがとうございます。
こういった情報は各所にありますが、まとめておくと便利ですよね。
投稿者: yuki | 2007年5月14日 14:13
>requireはrequire_once()より3-4倍遅い?
>空ファイルを forループで1万回呼んだ結果、4倍程度早かった。
requireとrequire_onceは違いますよ?
requireは無条件に読み込むが、require_onceは一度読んだファイルは読み込まない。
=>よって、同じファイルを1万回・・・では検証にならないし、「同じ処理を1万回」する為に読み込んでいる場合は、require_onceでは期待した動作にならない。
どうせ検証するなら、requireとincludeで検証してみてください。
(確か、requireの方がファイルが存在しない場合にfatalを出す処理があるので、requireの方が遅いはず。)
投稿者: wm | 2007年5月15日 09:35
たまたまたどり着いて試してみたのですが、
PHP Benchmark testでは
array_keys and for でしたが、
試してみると。
foreach の順でした…。
環境によって違うんでしょうかね??
でも改めて試す機会が出たので、非常にありがたかったです。
投稿者: marcov | 2007年10月27日 13:37
ありがとうございます!とても参考になりました。
投稿者: 石川 | 2009年1月20日 12:56