ホームページ > バックエンド開発 > PHPチュートリアル > PHP に効率性を求める - コードの実行速度を高速化します

PHP に効率性を求める - コードの実行速度を高速化します

WBOY
リリース: 2016-06-13 13:01:48
オリジナル
877 人が閲覧しました

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を使うならこう書くのがベストです

for($i=0,$j=count($array);$i<$j;$i++){

}

前に述べたように、文字列のスプライシングに使用される配列は 2 つのサイクルを実行する必要があるため遅くなります。ただし、多くの操作は配列を使用して完了できれば高速になります。
例: array_mar('trim',$array) は、for や foreach を記述するよりも明らかに高速です。

explode を使用して最初に配列に分割できます。for ループ内で strpos を使用しないことをお勧めします。


in_array 関数の効率の問題。 in_array が頻繁に使用され、配列が大きい場合は、配列をソートしてから fast_in_array
を使用することをお勧めします。

これは、PHP マニュアルに基づいてユーザーが追加した関数です。 (注: テストのため、小さな配列の場合は、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; 
} 
?> 

ログイン後にコピー
配列を使用して、変更可能な制御構造をすべて変更します。これには、三項演算子だけでなく、if、switch も含まれます。これにはもう 1 つの利点があります。それは、ソフト コーディング モードの思考を養えることです。

の代わりに

?? $class = $class == '奇数' : '偶数'

私たちは

を持っています

?? $flip = array('even' => 'odd', 'odd' => 'even');

?? $class = $flip[$class];

? ?

3. 機能の問題

正しい名前の関数を使用し、関数のエイリアスを使用しないでください。 PHP のエイリアスは、PHP のプロモーション (たとえば、split と join は VB の関数、implode とexplode は名前修正関数)、または古いバージョンとの互換性のために使用されます。一般に、名前の修正ほど速度は速くありません。
??

count は sizeof より高速です

is_integer は is_int より高速です
floatval は doubleval より高速です
implode は join より高速です
ini_set は ini_alter より高速です

もちろん、例外はほとんどありません。たとえば、fputs は fwrite よりも高速ですが、無視してもいいと思います。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート