プログラミングに役立つ情報をメモしています
PHP プログラミング

PHPのパフォーマンスを引き出すベストプラクティス63の日本語訳メモ

以下のページで紹介されているPHPのベストプラクティスを訳してみた。

63 Best Proctice to Optimize PHP Code Performance

  • staticにできるメソッドはstaticで宣言する
    ※ググってみるとpublicメソッドよりも遅いというベンチマークもあるようなので、実際に確認したほうがよさそう。echoのほうがprintよりも速い
  • stringをコンカチ(結合)するより、echoに複数の文字列を与える
  • 巨大な配列など大きな変数はunsetしてメモリを明示的に解放する。
  • マジックメソッドの使用は避ける(__autoloadなど)
  • require_onceは避ける
  • requireにはフルパスで指定する
  • スクリプトの開始時間を取得したい場合は、time()よりも、$_SERVER('REQUEST'_TIME')を使用する
  • regexを使った正規表現比較よりも文字列比較のために用意されている関数を使用する。
  • switchよりもifelse ifを使う(ただし条件が多い場合はswitchのほうが速い)。
    ※switchは比較が==と同じ、ゆるやかな比較なので、その意味でもswitchの使用には注意が必要。
  • エラー抑制の@はとても遅い。
  • Apacheのmod_deflateをオンにする。
    ※コンテンツを圧縮してネットワークの負荷を減らす。ただしCPU使用率が増えること、ブラウザ側が処理できるか確認することが必要。
  • DBのコネクションは使ったらクローズする。
  • ErrorMessageの出力は高価。
    ※trigger_error()関数は遅い
  • ループの中で関数をコールしない
  • グローバル変数へのアクセスはローカル変数よりも少し遅い
  • オブジェクトプロパティへのアクセスはローカル変数よりも少し遅い
  • メソッドの実行速度はクラスに定義されたメソッドの数に依存しない
  • 基底クラスのメソッドよりも、継承クラスのメソッドのほうが速い
  • 文字列は''(シングルクォーテーション)のほうが、"(ダブルクォーテーション)よりも速い
    ※”で囲んだ文字列はPHPが中を見て変数を解釈するため
  • echoに複数の文字列を渡すとき、,(コンマ)のほうが.(ドット)よりも速い。
  • 2,3行のPHPスクリプトより静的なHTMLファイルを使用する
    ※ほとんど変わらないページであれば、そのたびに生成するコストがもったいない。頻繁にアクセスされるページで、変化が少ないものは事前に計算しておくとよい。
  • PHPをキャッシュするプロダクトを導入する(リクエストごとにコンパイルするのはかわいそう)
    memcachedを活用する
  • if (strlen($foo) < 5)よりもif (!isset($foo{5}))のほうが速い(文字列を配列として扱う)
  • $i++よりも++$iのほうが速い
  • OOPに拘り過ぎない。オブジェクトやメソッドはメモリ(ヒープ)に対するオーバーヘッドが大きい
    ※ExtremeProgrammingにおけるYAGNI原則に照らしても、冗長な設計は避けるべき
  • データ構造をクラスにすることだけでなく、配列にすることも考える。
  • メソッドを分割しすぎない。本当に再利用するか?を考える。
  • メソッドは後で必要なときに分割できる
  • 長い時間のかかる関数は、Cの拡張プログラムで代替することを考える。
  • XDebugのようなツールを使って、コードのどの部分がどれだけの時間を消費しているかを調べ、ボトルネックを明らかにする
  • Apacheのmod_gzipを使って転送データを減らす
  • ループの条件に関数を使用しない。ループ最大値はループ開始前に計算しておく
  • データベースに格納される値に関しては、GETよりもPOSTを使用する(TCP/IPパケットのパフォーマンス上の理由)
  • 文字列の確認には、ctype_alnum, ctype_alpha, ctype_digitを使う(パフォーマンスが良い)
  • デバッグ中はerror_reporting(E_ALL)を使う
  • Apacheのallowoverridenoneに設定する
  • 静的ファイルは高速なファイルサーバーに置く