2008年5月10日土曜日

 

【PHP】プログラム最適化

追記:2008年6月16日

PHP最適化ベストプラクティスとやらを本気でdisる

可読性を下げてまでやる意味はない。
何倍の差といってもソースにそのコードが何万回と出るわけではない。
開発効率・メンテナンス性等も含めて検討すべき。

  1. 高速化は、デカい所からやれ!!
  2. 最適化は、脳味噌に適用しろ!!

システムの特性や環境にもよるので一概には言えないだろうが、気にしておきたい。

PHP最適化tipsまとめサイト - ウノウラボ Unoh Labs

  • 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() のようにループの度に呼ばれる関数はさけ、変数に格納する。
__set メソッド
定義しておくと存在しないメンバー変数に対して代入を行おうとすると __set メソッドが呼び出される。
通常は代入時点で新たにメンバー変数が生成される。
__get メソッド
存在しないメンバー変数を参照したとき __get メソッドが定義されていると、それをオーバーライドする。
デフォルト値の指定。
__autoload() メソッド
存在しないクラスを使用するプログラムを記述した場合エラーになる前にその関数が呼ばれる。 include_once などでそのクラスの定義ファイルを読み込むようにして負荷を軽くする。
__call メソッド
定義しておくと、存在しないクラスのメソッドの代わりに __call メソッドが呼び出される。

Optimizing PHP objects - Jaslabs: High performance Software

概要

  • すべての変数は最初に初期化すべき
  • メソッドで2回以上参照されるすべてのグローバル/オブジェクト変数はは、ローカル変数に格納したほうがよい。
  • よく使うメソッドは派生クラスに定義する。

詳細

  • メソッドでのローカル変数のインクリメントがもっとも早い。通常関数でのローカル変数のインクリメントもほぼ同じ。
  • グローバル変数のインクリメントはローカル変数のインクリメントより2倍遅い
  • オブジェクト変数のインクリメント($this->hoge++)よりローカル変数インクリメント($hoge++)の方が3倍早い
  • 未定義の変数のインクリメントよりも、初期化した変数のインクリメントの方が9-10倍早い
  • 宣言なしに使われるグローバル変数もローカル変数が増えるのと同じくらいコストがかかる(たぶんPHPはグローバル変数の存在を調べるため)
  • クラス内に10以上のメソッドがあってもパフォーマンスは変わらない
  • 派生クラスメソッドはスーパークラスメソッドより早い
  • 1つの引数と空の関数の呼び出しは、ローカル変数のインクリメント7-8回分のコスト。同じようなメソッドの呼び出しは 15回分のコストがかかる

ラベル: ,


コメント: コメントを投稿

登録 コメントの投稿 [Atom]



この投稿へのリンク:

リンクを作成



<< ホーム

This page is powered by Blogger. Isn't yours?

登録 投稿 [Atom]

Google