本案件の開発言語はPHPですが、快適な動作をさせるために、出来るだけ守るべきコード規約を策定します。
以下は、http://d.hatena.ne.jp/koto2/20080518/1211070116を参考にさせて頂きました。
- static にできるメソッドは static として宣言する。(4倍速い)
- echo の方が print より速い。
- echo ‘文’,’字’; (カンマ区切り)の方が、’文’.’字’ (ドット連結)より速い。
- ループの最大値は、ループ「内」ではなく「前」にセットする。
- 大きい配列のような変数は unset() してメモリを解放する。
- マジックメソッド(例: __get, __set, __autoload)は使用を避ける。
- require_once はハイコスト。
- include や require でファイルはフルパスで指定する。
- スクリプト開始時間は time() でなく $_SERVER[‘REQUEST_TIME’] で取得。
- 可能であれば、正規表現より strncasecmp、strpbrk、stripos を使う。
- strtr(str_replace の4倍速い) > str_replace > preg_replace の順に速い。
- 引数に配列、文字列両方を受け入れるような関数は避け、個別に関数化する。
- if をたくさん使ってるなら switch を活用する。
- @によるエラー制御はすごく遅い。
- Apache の mod_deflate(Apache2系) を ON にする。
- 処理が終わったらデータベースの接続は切っておく。
- $row[‘id’] は $row[id] より7倍速い。
- エラーメッセージはハイコスト。
- for 文の条件式には count($array) のような関数をいれない。(変数に格納)
- メソッド内ではローカル変数をインクリメントするのが一番速い。
- グローバル変数のインクリメントはローカル変数より2倍遅い。
- オブジェクト変数(例:$this->v++)のインクリメントはローカルより3倍遅い。
- 未定義のローカル変数のインクリメントは定義されたものより9?10倍遅い。
- 未定義のグローバル変数についても同様。
- メソッドの起動コストはクラス内のメソッド数とは無関係。
- 派生クラス内のメソッドは、基底クラスで定義されたメソッドよりも速い。
- 引数1つの空関数を呼び出すのにも、ローカル変数 $local++ 7?8回分のコスト。
- ダブルクォート より シングルクォート の方が若干速い。
- PHP スクリプトは静的な HTML ページよりも2?10倍の時間がかかる。
- キャッシュを利用しよう。通常、コンパイル回数 x 25?100% 分速くなる。
- これもキャッシュについて。memcached を使う。
- if (strlen($foo) < 5) を調べたいなら if (!isset($foo{5})) と書くと速い。
- $i++ より ++$i の方が速い。(そういう opcode optimizer が走ってる場合)
- 全部が全部 OOP でなくても良い。(コストやメモリの浪費になってる恐れ)
- すべてのデータをクラスにしようとしないこと。配列も十分便利。
- メソッドを分割しすぎない。(どれを再利用するのかよく考える)
- メソッドを分割したくなったら後でいくらでもできる。
- もとから用意されてる 関数たち を活用しよう。
- 非常に時間のかかる関数 → C言語による拡張モジュール化も検討する。
- コードをプロファイリングしてボトルネックを見つける。Xdebug とか。
- Apache の mod_gzip(Apache 1系)は、転送量を最大80%減。
- : A HOWTO on Optimizing PHP with tips and methodologies を参照。
- ループ処理には foreach を使う。
- 複雑なクラスを作ってるなぁと思ったら → Singleton モデルを検討する。
- DB に入れる値なら GET より POST を使う。(パフォーマンスが上がる)
- 可能なら正規表現より、ctype_alnum、ctype_alpha、ctype_digit を使う。
- ファイル指定は basename / file_exists / open_basedir よりフルパス指定が速い。
- require_once より require を使おう。(opcode キャッシュがらみの理由で)
- 一時的なファイルを作るときには tmpfile や tempnam を使う。
- 外部サービスに XMLHTTP で接続するときにはエラー回避のため Proxy を使う。
- デバッグするときは error_reporting (E_ALL); にしておく。
- Apache の allowoverride を “none” にしておくとパフォーマンスが向上。
- 静的なコンテンツには thttpd のような高速なファイルサーバを使う。
- パスなどの設定パラメータは配列に serialize して入れ、キャッシュしておく。
- アクセスの多いページには PHP の 出力バッファリング を使う。
- DB 固有の prepare メソッドではなく PDO::prepare を使う。
- SELECT * (ワイルドカード)を使うのはやめる。
- PHP より賢い DB ロジック(queries, joins, views, procedures)を活用する。
- SQL の省略表記を活用する。
(例:INSERT INTO MYTABLE (FIELD1,FIELD2) VALUES ((“x”,”y”),(“p”,”q”));)より良いシステムを作るための前提として大切だと思います。
以下も大変参考になります。
http://gihyo.jp/dev/feature/01/php-optimize/0001
http://gihyo.jp/dev/feature/01/php-optimize/0002
http://gihyo.jp/dev/feature/01/php-optimize/0003
http://gihyo.jp/dev/feature/01/php-optimize/0004