PHP に効率性を求める - コードの実行を高速化します
スクリプト言語はすべて非効率的であり、PHP も例外ではありません。実際には、コードの各行で効率が節約されるか、無駄になります。したがって、ここではコードの実行速度を速くするための基本的な効率の常識を説明します。
(注: PHP コードを最適化するための提案の多くのバージョンを見てきましたが、体系的でも包括的でもないと感じました。ここでは、注意を払う必要があるもののほんの一部を紹介します。)
1. 文字列の問題
1. 文字の結合は配列の内部分解よりも大きく、sprintf よりも高速です
次のコードを実行できます:
<?php /** * Simple function to replicate PHP 5 behaviour */ function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } $start=microtime_float(); // standard string append $str = ''; for ($i = 300000; $i > 0; $i--) { $str .= 'String concatenation. '; } $end = microtime_float(); echo("<br/> t i m e :" . round( $end - $start ,2) ."<br/>"); $start=microtime_float(); // array join $str = ''; $sArr = array(); for ($i = 300000; $i > 0; $i--) { $sArr[] = 'String concatenation. '; } $str = implode('',$sArr); $end = microtime_float(); echo("<br/> t i m e :" . round( $end - $start ,2) ."<br/>"); ?>
?
私のマシンの出力は次のとおりです:
時間:0.14
時間:0.25
2. 文字列の交換
同時に、接続できない場合にのみ交換を検討してください。置き換え方法については、以下の優先順位に従ってコードを記述することを検討してください。
sprintf は str_replace より高速です preg_replace は strstr より高速です
3. 文字列検索、文字列比較:
誰かのオンラインテストの結果は次のとおりです:
結果
ereg .956
preg_match .050
strstr .222
strpos .033
可視:
strpos は preg_match よりも速く、strstr よりも速く ereg よりも速い
誰かstrstrが速いと言われていますが、forループではstrstrよりもpreg_match_allの方が確実に速いです
3. 文字列出力:
echo は print よりも高速です。これは言うまでもありません。 しかし、できるだけ高速に echo を使用するとどうなるでしょうか?
$foo = 'John SMITH';?
echo "こんにちは、$foo 。私のブログにようこそ。";? 🎜>echo 'こんにちは ' . $foo ' ようこそ私のブログへ。';?
エコー 'こんにちは ' ' ' ようこそ私のブログへ ';
わかると思いますが、最後のものが一番早いです。
2. 配列の問題:
foreach は for より高速であることは誰もが知っています。 それだけではありません。本当にforを使うならこう書くのがベストです
}
前に述べたように、文字列のスプライシングに使用される配列は 2 つのサイクルを実行する必要があるため遅くなります。ただし、多くの操作は配列を使用して完了できれば高速になります。
例: array_mar('trim',$array) は、for や foreach を記述するよりも明らかに高速です。
in_array 関数の効率の問題。 in_array が頻繁に使用され、配列が大きい場合は、配列をソートしてから fast_in_array
を使用することをお勧めします。
この関数は、バイナリ検索を使用するため、直接の置換として使用できるはずです。
?
<?php function fast_in_array($elem, $array) { $top = count($array) -1; $bot = 0; while($top >= $bot) { $p = floor(($top + $bot) / 2); if ($array[$p] < $elem) $bot = $p + 1; elseif ($array[$p] > $elem) $top = $p - 1; else return TRUE; } return FALSE; } ?>
の代わりに
?? $class = $class == '奇数' : '偶数'私たちは
を持っています
?? $flip = array('even' => 'odd', 'odd' => 'even');?? $class = $flip[$class];
? ?3. 機能の問題
正しい名前の関数を使用し、関数のエイリアスを使用しないでください。 PHP のエイリアスは、PHP のプロモーション (たとえば、split と join は VB の関数、implode とexplode は名前修正関数)、または古いバージョンとの互換性のために使用されます。一般に、名前の修正ほど速度は速くありません。
??
is_integer は is_int より高速です
floatval は doubleval より高速です
implode は join より高速です
ini_set は ini_alter より高速です
もちろん、例外はほとんどありません。たとえば、fputs は fwrite よりも高速ですが、無視してもいいと思います。