Hatena::ブログ(Diary)

カタコト日記 このページをアンテナに追加 RSSフィード

2008-05-18

www.chazzuka.com

PHP コード最適化 Best Practices 63+

みたいなタイトルの記事を Digg 経由で発見。チートシート代わりにと思い超訳*1

no title


PHP 最適化 ベストプラクティス

  • 01. static にできるメソッドは static として宣言しよう。(4倍速い)
  • 02. echo の方が print より速い。
  • 03. echo '文','字'; (カンマ区切り)の方が、'文'.'字' (ドット連結)より速い。
  • 04. ループの最大値は、ループ「内」ではなく「前」にセットしておこう。
  • 05. 大きい配列のような変数unset() してメモリを解放しよう。
  • 06. マジックメソッド(例: __get, __set, __autoload)は使用を避けよう。
  • 07. require_once はハイコストなのです。
  • 08. includerequire でファイルはフルパスで指定しよう。
  • 09. スクリプト開始時間は time() でなく $_SERVER['REQUEST_TIME'] で取得。
  • 10. 可能であれば、正規表現より strncasecmpstrpbrkstripos を使おう。

  • 11. strtr(str_replace の4倍速い) > str_replacepreg_replace の順に速い。
  • 12. 引数配列文字列両方を受け入れるような関数は避け、個別に関数化しよう。
  • 13. if をたくさん使ってるなら switch を活用しよう。(訳注:ってことでいい?)
  • 14. @によるエラー制御はすんごく遅い。
  • 15. Apachemod_deflate(Apache2系) を ON にしておこう。(No.42 参照)
  • 16. 処理が終わったらデータベースの接続は切っておこう。
  • 17. $row['id'] は $row[id] より7倍速い。
  • 18. エラーメッセージはハイコスト。
  • 19. for 文の条件式には count($array) のような関数をいれない。(変数に格納)
  • 20. メソッド内ではローカル変数をインクリメントするのが一番速い。

  • 21. グローバル変数のインクリメントはローカル変数より2倍遅い。
  • 22. オブジェクト変数(例:$this->v++)のインクリメントはローカルより3倍遅い。
  • 23. 未定義のローカル変数のインクリメントは定義されたものより9〜10倍遅い。
  • 24. 未定義のグローバル変数についても同様。
  • 25. メソッドの起動コストはクラス内のメソッド数とは無関係。
  • 26. 派生クラス内のメソッドは、基底クラスで定義されたメソッドよりも速い。
  • 27. 引数1つの空関数を呼び出すのにも、ローカル変数 $local++ 7〜8回分のコスト。
  • 28. ダブルクォート より シングルクォート の方が若干速い。
  • 29. 03 と重複か。(注:これは複数の引数を受け取る echo でのみ有効)
  • 30. PHP スクリプトは静的な HTML ページよりも2〜10倍の時間がかかる。

  • 31. キャッシュを利用しよう。通常、コンパイル回数 x 25〜100% 分速くなる。
  • 32. これもキャッシュについて。memcached とか使おうよ。
  • 33. if (strlen($foo) < 5) を調べたいなら if (!isset($foo{5})) と書くと速い。
  • 34. $i++ より ++$i の方が速い。(そういう opcode optimizer が走ってる場合)
  • 35. 全部が全部 OOP でなくても良い。(コストやメモリの浪費になってるかも)
  • 36. すべてのデータをクラスにしようとしないこと。配列も十分便利です。
  • 37. メソッドを分割しすぎない。(どれを再利用するのかよく考えよう)
  • 38. メソッドを分割したくなったら後でいくらでもできる。
  • 39. もとから用意されてる 関数たち を活用しよう。
  • 40. 非常に時間のかかる関数C言語による拡張モジュール化も検討しよう。



  • 61. SELECT * (ワイルドカード)を使うのはやめよう。
  • 62. PHP より賢い DB ロジック(queries, joins, views, procedures)を活用しよう。
  • 63. SQL の省略表記を活用しよう。
    (例:INSERT INTO MYTABLE (FIELD1,FIELD2) VALUES (("x","y"),("p","q"));)


以上。

っていうか、ありすぎ (;´∀`)


前半は Redirect と同じでしたね。

こういう Tips は検証環境によっていろいろと差が出てくるみたいですけど、

どっちにしようか迷ったときなんかには参考にしてもいいんじゃないかな。*3



元ネタの元ネタらしきもの(引用の引用とかで正確には不明ですが…)

これを書いてる途中に発見した関連記事

なんだこれは、もっとくわしく!

って方へ。簡単な解説(例とか)つけてみました。よろしければどうぞ。

PHPコード最適化Tipsのウソと本当(解説) - カタコト日記

*1:文中のリンクは、元記事にはないんですが、参考のため勝手につけちゃいました。

*2:原文:Do consider using the Singleton Method when creating complex PHP classes.
どういう意味なのかちょっとよくわかりません…。コメント欄で試行錯誤してます。

*3:訳を思いっきりはしょってる & 何より根拠を知らずにがんがん使うのは危険だと思うので、英語ですけど元ネタもあわせてどうぞ。

karronolikarronoli 2008/05/22 19:45 51番
×fileexists
○file_exists
それにしてもこれらの項目は昔からいろんなところで流用されてますね。
内容も半端って言うか基本って言うか間違ってるというか、、、

とこんなこと書いてても結局毎回気になっちゃうですよねー

koto2koto2 2008/05/22 23:40 > id:karronoli さま
ご指摘ありがとうございます。
修正してついでにこれらにも参考リンクを貼っておきました!

そうですねぇ。
個人的には、”黄金律的” な Tips と特定の文脈に左右されそうな ”泥臭い経験則” が
混ざってそうだなぁという印象を受けました。逆に言うと、それらを判別できる感覚を
みがいておかないと、誤用の危険性もあるってことですよね。

「本当にそうなのかなぁ」と考えるエントリーポイントとしては
すごく参考になるんですけどね。

camelmasacamelmasa 2008/05/23 09:12 勉強になります!

koto2koto2 2008/05/25 09:32 > id:camelmasa さま
おたがいがんばりましょう!

koto2koto2 2008/05/25 10:08 48番について

TB いただいた id:gegegen さんのエントリーで
「ここではデザインパターンのSingletonとして扱っているけど、
あまりの不自然さに違和感があるなー。特異メソッドの事じゃないよね」
とご指摘いただきました。「特異メソッド」っていうのがあるんですね…。
原文は Singleton Method とあるので、おそらくそれが正解だと思います。
間違った訳文で無用な混乱をさせてしまいましたね。失礼いたしました。

[原文]
Do consider using the Singleton Method when creating complex PHP classes.
[訳文]
複雑なクラスがいくつも → 特異メソッドを使うことを検討しよう。
(元の訳:複雑なクラスを作ってるなぁと思ったら → Singleton モデルを検討しよう。)

がんばって再意訳しました。なにぶん「特異メソッド」が何かよくわかってないので
訳しづらいのですが…。もっといいニュアンスの訳があったらコメント欄にぜひ!

id:gegegen さんのエントリー
http://d.hatena.ne.jp/gegegen/20080524/1211622711

koto2koto2 2008/05/25 19:41 さらに追記

「特異メソッド」って元々 Ruby のもので PHP では(おそらく)実装できない
類いのものなんですね。早とちっちゃいました。(ノ´∀`*)
また、id:gegegen さんに教えていただきました。

うーん、ということでまた元の訳(デザパタの Singleton)に戻してはみたんですが
真意はヤミの中ですねぇ。ま、仕方ないか。元ネタにもこれ以上のことが
何も書かれていないのです。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証