静的呼び出しメンバーは静的として定義する必要があります (PHP5 のみ)
ヒント: PHP 5 では、静的メンバーの概念が導入されています。静的メンバーは、PHP 4 の関数内の静的変数と同じ機能を持ちますが、前者はクラスのメンバーとして使用されます。静的変数は、Ruby のクラス変数に似ています。クラスのすべてのインスタンスは同じ静的変数を共有します。
引用:
// PHP CODE Highliting for CU by dZ902 <?php class foo { function bar() { echo 'foobar'; } } $foo = new foo; // instance way $foo->bar(); // static way foo::bar(); ?>
非静的メンバーを静的に呼び出す効率は、静的メンバーを静的に呼び出すよりも 50 ~ 60% 遅くなります。主な理由は、前者は E_STRICT 警告を生成し、内部で変換する必要があるためです。
[size=+2]クラス定数を使用する (PHP5 のみ)
ヒント: PHP 5 の新機能。C++ の const に似ています。
クラス定数を使用する利点は次のとおりです:
- コンパイル時の解析、余分なオーバーヘッドなし
- ハッシュ テーブルが小さいため、内部ルックアップが高速になります
- クラス定数は特定の「名前空間」にのみ存在するため、ハッシュ名は短くなります
- コードがよりクリーンになり、デバッグが容易になります
[size=+2](一時的に) require/include_once は使用しないでください
require/include_once は呼び出されるたびにターゲット ファイルを開きます。
- 絶対パスを使用する場合、PHP 5.2/6.0 ではこの問題は発生しません
- APC キャッシュ システムの新しいバージョンは、この問題を解決しました
ファイル I/O の増加 => 効率の低下
必要に応じて、ファイルが必須/インクルードされているかどうかを自分で確認できます。
[size=+2]意味のない関数を呼び出さない
対応する定数がある場合は関数を使用しないでください。
引用:
// PHP CODE Highliting for CU by dZ902 <?php php_uname('s') == PHP_OS; php_version() == PHP_VERSION; php_sapi_name() == PHP_SAPI; ?>
あまり使用していませんが、効率向上は約3500%です。
[size=+2]最速の Win32 チェック
引用:
// PHP CODE Highliting for CU by dZ902 <?php $is_win = DIRECTORY_SEPARATOR == '//'; ?>
- 関数は必要ありません
- Win98/NT/2000/XP/Vista/Longhorn/Shorthorn/Whistler...ユニバーサル
- いつでも利用可能
[size=+2]時間の問題 (PHP>5.1.0 のみ)
ソフトウェアの現在時刻をどのようにして知ることができますか?シンプルに、「time() time() もう一度、あなたは私に尋ねます...」。
ただし、この関数は常に呼び出されるため、処理が遅くなります。
さて、$_SERVER['REQUEST_TIME'] を使用します。関数を呼び出す必要はありません。再度保存してください。
[size=+2]PCRE を高速化
- 保存する必要のない結果については、() を使用せず、常に (?
を使用してください)
このようにして、PHP は一致するコンテンツにメモリを割り当てる必要がなくなり、コストが節約されます。効率が約15%向上します。
・ 正規表現が使用できる場合は、マニュアルの「文字列関数」をよく読んで解析してください。見逃している便利な機能はありますか?
例:
strpbrk() strncasecmp() strpos()/strrpos()/stripos()/strripos()
[size=+2]strtr を加速します
変換する必要があるのが 1 文字だけの場合は、配列の代わりに文字列を使用して strtr を実行します:
引用:
// PHP CODE Highliting for CU by dZ902 <?php $addr = strtr($addr, "abcd", "efgh"); // good $addr = strtr($addr, array('a' => 'e', // ... )); // bad ?>
効率の向上: 10 倍。
[size=+2]不必要な置換を行わないでください
str_replace は、置換を行わない場合でも引数にメモリを割り当てます。とても遅いです!解決策:
- strpos を使用して最初に (非常に高速に) 検索し、置換が必要かどうかを確認し、必要な場合は
を置換します。
効率:
- 交換が必要な場合: 効率はほぼ同等で、差は約 0.1% です。
- 置換が必要ない場合: strpos を使用すると 200% 高速になります。
[size=+2]邪悪な @ オペレーター
@ 演算子を乱用しないでください。 @ は単純そうに見えますが、実際には舞台裏で多くの操作が行われています。 @ を使用した場合と使用しない場合の効率の差は 3 倍です。
特にループ内で @ を使用しないでください。5 ループのテストでは、最初に error_reporting(0) を使用してエラーをオフにし、ループが完了してからオンにすると、@ を使用するよりも高速になります。
[size=+2]strncmp を上手に活用しましょう
「最初の n 文字」が同じかどうかを比較する必要がある場合は、substr/strto lower の代わりに strncmp/strncasecmp を使用し、PCRE は言うまでもなく、ereg については決して言及しないでください。 strncmp/strncasecmp は (それほどではありませんが) 最も効率的です。
[size=+2]substr_compare は注意して使用してください (PHP5 のみ)
上記のロジックによれば、substr_compare は最初とその後で substr よりも高速になるはずです。以下の場合を除き、答えはノーです。
- 大文字と小文字を区別しない比較
- より大きな文字列を比較
[size=+2]文字列の代わりに定数を使用しないでください
理由:
- ハッシュ テーブルを 2 回クエリする必要があります
- 定数名は小文字に変換する必要があります (2 番目のクエリを実行するとき)
- E_NOTICE 警告を生成
- 一時的な文字列が作成されます
効率の差: 700%。
[size=+2]for ループの条件文に count/strlen/sizeof を入れないでください
ヒント: 私の個人的なアプローチ
引用:
// PHP CODE Highliting for CU by dZ902 <?php for ($i = 0, $max = count($array);$i < $max; ++$i); ?>
以下と比較した効率の向上:
- カウント 50%
- ストレン 75%
[size=+2]短いコードは必ずしも速いとは限りません
引用:
// PHP CODE Highliting for CU by dZ902 <?php // longest if ($a == $b) { $str .= $a; } else { $str .= $b; } // longer if ($a == $b) { $str .= $a; } $str .= $b; // short $str .= ($a == $b ? $a : $b); ?>
どちらが速いと思いますか?
効率の比較:
- 最長: 4.27
- ロング: 4.43
- ショート: 4.76
信じられない?もう 1 つあります:
引用:
// PHP CODE Highliting for CU by dZ902 <?php // original $d = dir('.'); while (($entry = $d->read()) !== false) { if ($entry == '.' || $entry == '..') { continue; } } // versus glob('./*'); // versus (include . and ..) scandir('.'); ?>
哪个快?
效率比较:
- original: 3.37
- glob: 6.28
- scandir: 3.42
- original without OO: 3.14
- SPL (PHP5): 3.95
画外音:从此也可以看出来 PHP5 的面向对象效率提高了很多,效率已经和纯函数差得不太多了。
[size=+2]提高 PHP 文件访问效率
需要包含其他 PHP 文件的时候,使用完整路径,或者容易转换的相对路径。
QUOTE:
// PHP CODE Highliting for CU by dZ902 <?php include 'file.php'; // bad approach incldue './file.php'; // good include '/path/to/file.php'; // ideal ?>
[size=+2]物尽其用
PHP 有很多扩展和函数可用,在实现一个功能的之前,应该看看 PHP 是否有了这个功能?是否有更简单的实现?
QUOTE:
// PHP CODE Highliting for CU by dZ902 <?php $filename = "./somepic.gif"; $handle = fopen($filename, "rb"); $contents = fread($handle, filesize($filename)); fclose($handle); // vs. much simpler file_get_contents('./somepic.gif'); ?>
[size=+2]关于PHP引用的技巧
引用可以:
- 简化对复杂结构数据的访问
- 优化内存使用
QUOTE:
// PHP CODE Highliting for CU by dZ902 <?php $a['b']['c'] = array(); // slow 2 extra hash lookups per access for ($i = 0; $i < 5; ++$i) $a['b']['c'][$i] = $i; // much faster reference based approach $ref =& $a['b']['c']; for ($i = 0; $i < 5; ++$i) $ref[$i] = $i; ?>
QUOTE:
// PHP CODE Highliting for CU by dZ902 <?php $a = 'large string'; // memory intensive approach function a($str) { return $str.'something'; } // more efficient solution function a(&$str) { $str .= 'something'; } ?>