ホームページ >php教程 >php手册 >PHPの実行速度最適化手法のまとめ

PHPの実行速度最適化手法のまとめ

WBOY
WBOYオリジナル
2016-06-13 12:30:171016ブラウズ

1. file、fopen、feof、fgets などの一連のメソッドの代わりに file_get_contents を使用できる場合は、より効率的な file_get_contents を使用してください。ただし、URL ファイルを開くときは、file_get_contents の PHP バージョンの問題に注意してください。

2. PHP のファイル操作効率は低くありませんが、実行するファイル操作はできるだけ少なくしてください。 3. 最適化 SELECT SQL ステートメント、できるだけ少ない INSERT 操作と UPDATE 操作を実行します (UPDATE で批判されました)。

4. できるだけ PHP 内部関数を使用します (ただし、 PHP に存在しないのは時間の無駄です。これは経験の問題です。

5. ループ内で変数、特に大きな変数を宣言しないでください。 (これは PHP で注意が必要なだけの問題ではないでしょうか?);


6. 多次元配列でネストされた代入を行わないようにしてください。 🎜>

7. PHP を使用できます。内部文字列操作関数の場合は、



8 を使用する方が効率的です。 while および for ループの代わりに foreach を使用します。9. 文字列を引用符で囲むには、二重引用符の代わりに i を使用します。 i=i 1 の代わりに =1。 C/C の習慣に準拠しており、非常に効率的です。



11. グローバル変数は使用後に unset() する必要があります。


static として定義する (PHP5 のみ)

ヒント: PHP5 では、静的メンバーの概念が導入されています。これは、PHP4 の関数内の静的変数と同じ機能を持ちますが、前者はクラスのメンバーとして使用されます。 。静的変数は、Ruby のクラス変数に似ています。クラスのすべてのインスタンスは同じ静的変数を共有します。非静的メンバーを静的に呼び出す効率は、静的メンバーを静的に呼び出すよりも 50 ~ 60% 遅くなります。主な理由は、前者は E_STRICT 警告を生成し、内部で変換する必要があるためです。

class foo {
function bar() {
echo 'foobar';
}
}
$foo = new foo; 🎜>// インスタンス方法
$foo->bar();
foo::bar();

クラス定数を使用します。 (PHP5 のみ)

ヒント: C の const に似た PHP5 の新しい関数。

クラス定数を使用する利点は次のとおりです:

- コンパイル時の分析、追加のオーバーヘッドなし

- ハッシュ テーブルが小さいため、内部ルックアップが高速になります

- クラス定数は特定の「名前空間」にのみ存在するため、ハッシュ名は短くなります

- コードがすっきりし、デバッグが容易になります



(一時的に) 使用しないでください require/include_once

require/include_once は呼び出されるたびにターゲット ファイルを開きます。

- 絶対パスを使用する場合、PHP 5.2/6.0 にはこの問題はありません

- APC キャッシュ システムの新しいバージョンでは、この問題が解決されました

File I/ O 増加 => ; 効率の低下

必要に応じて、ファイルが必須/含まれているかどうかを確認できます。



意味のない関数を呼び出さない

対応する定数がある場合は関数を使用しないでください。

php_uname('s') == PHP_OS;
php_sapi_name() == PHP_SAPI;
あまり使用していませんが、効率向上は約3500%です。



最速の Win32 チェック

$is_win = DIRECTORY_SEPARATOR == '\'
?>関数が必要

- Win98/NT/2000/XP/Vista/Longhorn/Shorthorn/Whistler... ユニバーサル

- いつでも利用可能



時間 質問 (PHP>5.1.0 のみ)

ソフトウェアの現在時刻はどのようにしてわかりますか?シンプルに、「time() time() もう一度、あなたは私に尋ねます...」。

しかし、常に関数を呼び出すことになるため、処理が遅くなります。

これで、$_SERVER['REQUEST_TIME'] を使用できるようになりました。関数を呼び出す必要はありません。再度保存してください。



Accelerate PCRE

- 保存する必要のない結果については、() を使用せず、常に (?:) を使用してください。

このようにして、PHP はコンテンツを一致させる必要がなく、メモリを割り当てて保存します。効率は約15%向上します。

- 正規表現を使用できる場合は、分析する際にマニュアルの「文字列関数」セクションをよく読んでください。見逃している便利な機能はありますか?

例:

strpbrk()

strncasecmp()

strpos()/strrpos()/stripos()/strripos()



strtr の高速化

変換する必要があるのが 1 文字だけの場合は、配列の代わりに文字列を使用して strtr を実行します:

< ;?php
$addr = strtr($addr, "abcd", "efgh"); // 良い
$addr = strtr($addr, array('a' => 'e',
// ..
) // 悪い
?> 効率の向上: 10 回。



不必要な置換は行わないでください。

置換を行わない場合でも、str_replace はパラメータにメモリを割り当てます。とても遅いです!解決策:

- 最初に (非常に高速に) strpos を使用して検索し、必要に応じて

を置き換えます。 効率:

- 必要な場合。交換可能: 効率はほぼ同等で、その差は約 0.1% です。

- 置換が必要ない場合: strpos を 200% 高速に使用します。



邪悪な @ 演算子

@ 演算子を乱用しないでください。 @は単純そうに見えますが、実際には裏では多くの処理が行われています。 @ を使用する場合と使用しない場合の効率の差は 3 倍です。

特にループ内で @ を使用しないでください。5 つのループのテストでは、最初に error_reporting(0) を使用してエラーをオフにし、ループが完了してからオンにすると高速になります。 @を使用するよりも。



strncmp を上手に活用する

「最初の n 文字」が同じかどうかを比較する必要がある場合は、substr/strto lower の代わりに strncmp/strncasecmp を使用します。 PCREだけでも。 strncmp/strncasecmp が最も効率的です (ただし、それほど高いわけではありません)。



substr_compare は注意して使用してください (PHP5 のみ)

上記の理由によると、substr_compare は最初とその後で substr よりも高速になるはずです。


- 大文字と小文字を区別しない比較

- より大きな文字列を比較





Don文字列の代わりに定数を使用しない

理由:

- ハッシュ テーブルを 2 回クエリする必要がある

- 定数名を小文字に変換する必要がある (2 回目のクエリ時) )

- E_NOTICE 警告を生成します

- 一時文字列を作成します

効率の差: 700%。





for ループの条件文に count/strlen/sizeof を入れないでください

ヒント: 私の個人的なアプローチ

for ($i = 0, $max = count($array);$i <$max; $i);
?> 効率の向上は相対的です。 to:

- count 50%

- strlen 75%



短いコードは必ずしも速いとは限りません


< ;?php
//最長
if ($a == $b) {
$str .= $a;
} else {
$str .= $b; >}
// より長い
if ($a == $b) {
$str .= $a;
}
$str .= $b; short
$str .= ($a == $b ? $a : $b);
?>
どれが速いと思いますか?

効率の比較:

- 最長: 4.27

- 長い: 4.43

- 短い: 4.76

信じられないほどですか?もう 1 つ:


// 元の
$d = dir('.');
while (($entry = $d-> read ()) !== false) {
if ($entry == '.' || $entry == '..') {
続行
}
}
/ / 対
glob('./*');
// 対 (. と .. を含む)
scandir('.');
どれですかもっと早く?

効率の比較:

- オリジナル: 3.37

- glob: 6.28

- scandir: 3.42

- OO なしのオリジナル: 3.14

- SPL (PHP5): 3.95

Voiceover: これから、PHP5 のオブジェクト指向の効率が大幅に向上していることがわかりますが、効率はそれほど高くありません純粋関数とは異なります。



PHP ファイルへのアクセス効率の向上

他の PHP ファイルを含める必要がある場合は、フルパスまたは変換が容易な相対パスを使用します。

include 'file.php'; // 悪いアプローチ
include './file.php' // 良い
include '/path/to/file .php'; // 理想的な
?>


すべてを最大限に活用する

関数を実装する前に、次のことを行う必要があります。見てください PHPにはこの機能がありますか?もっと簡単な実装はありますか?

$filename = "./somepic.gif";
$handle = fopen($filename, "rb");
$contents = fread($handle) , filesize($filename));
fclose($handle);
// より単純な
file_get_contents('./somepic.gif');





参照に関するヒント

参照により次のことが可能になります。

- 複雑な構造化データへのアクセスを簡素化します

- メモリを最適化します < を使用します🎜>

$a['b']['c'] = array();
// アクセスごとに 2 つの余分なハッシュ検索が遅い
for ($ i = 0; $i <5; $i)
$a['b']['c'][$i] =
// より高速な参照ベースのアプローチ
$ ref =& $a['b']['c'];
for ($i = 0; $i <5; $i)
$ref[$i] = $i; >?>
$a = 'large string';
// メモリを大量に使用するアプローチ
function a($str){
return $str.' ;
}
// より効率的な解決策
function a(&$str){
$str .= 'something';

========================================== ==

参考資料

http://ilia.ws

Ilia の個人 Web サイト、ブログ、彼が参加した開発の一部や出版物へのリンクなど。

http://ez.no

eZ components 公式 Web サイト、eZ comp は、効率性を自らの責任とする PHP5 用のオープンソース ユニバーサル ライブラリであり、Ilia も開発に参加しました。

http://phparch.com

php|architect、優れた php 発行者/トレーニング組織。お金がない場合、または購入できない場合は、オンラインで入手可能な古典的な海賊版が多数存在します。

http://talks.php.net

PHP カンファレンスのスピーチ集はまだそれほど豊富ではありませんが、内容は寝食を忘れるほど良いものばかりです。眠い朝や昼食後などにじっくり勉強すると、寝食を忘れてしまいますので、注意して学習することをおすすめします。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。