PHP:テンプレートのパフォーマンス

私は何について話しているのですか?



そうそう、私は余暇に行った小さなテストについてお話ししたかったのです。 事実、私は車輪を再発明するのが好きです(この無邪気な趣味で私を蹴らないでください)。 したがって、私がハッカープログラマーだったとき、テンプレートエンジンの実装について考えました(それについて考えなかった人は、私に石を投げさせてください)。

有名なテンプレートエンジンのパフォーマンスを比較する場合-申し訳ありませんが、また別の機会に

この記事のトピックは、単純なテンプレートを使用するいくつかの特別なケースのパフォーマンスを調べることです。



実際に分析されたもの



多くの人がテンプレートが何であるかを知っており、知らない人はウィキペディアを読んで、テンプレートはビューを表示する方法です(ビュー)

実際、この問題には3つのアプローチがあります(サードパーティの開発とXML / XSLTなどのモジュールはカウントしません):

  1. テンプレートが記述されている通常のPHPファイルを接続する

    あるテンプレート言語でのテンプレートの読み取り、解析、実行

    ポイント2ただし、PHPでコンパイルされたテンプレートコードをキャッシュする



    ソースのテスト



    シンプルインクルード



    関数file_included(){
         $ vars ['some'] = 'some';
         include 'included.php';
     }
    


    簡単な要求



    関数file_required(){
         $ vars ['some'] = 'some';
         「included.php」が必要です;
     }
    


    ファイルの読み取りと実行



    関数file_evaled(){
         $ vars ['some'] = 'some';
         $ content = file_get_contents( 'included.php');
         eval( '?>'。$ content);
     }
    


    正規表現の解析



    関数file_tpl_preg(){
         $ vars ['some'] = 'some';
         $ content = file_get_contents( 'included.tpl');
         $ content = preg_replace( '#\ {(\ w +)\}#'、 '<?= $ vars [\' \ 1 \ ']?>'、$ content);
         eval( '?>'。$ content);
     }
    


    文字列置換解析



    関数file_tpl_strtr(){
         $ vars ['some'] = 'some';
         $ content = file_get_contents( 'included.tpl');
         $ content = strtr($ content、array(
             '{' => '<?  $ vars [\ ''、
             '}' => '\']?> '、
         ));
         eval( '?>'。$ content);
     }
    


    変更時刻をチェックすることで、キャッシュを使用した正規表現



    関数file_tpl_preg_cashe(){
         $ file = 'included';
         if(filemtime($ file。 '。tpl.php')<filemtime($ file。 '。tpl')){
             $ content = file_get_contents( 'included.tpl');
             $ content = preg_replace( '#\ {(\ w +)\}#'、 '<?= $ vars [\' \ 1 \ ']?>'、$ content);
             file_put_contents($ファイル。 '。tpl.php'、$コンテンツ);
         }
         $ vars ['some'] = 'some';
        インクルード$ファイル '。tpl.php';
     }
    


    単純な存在チェックによるキャッシュ付きの正規表現



    関数file_tpl_manual_cashe(){
         $ file = 'included';
         if(!file_exists($ file。 '。tpl1.php')){
             $ content = file_get_contents( 'included.tpl');
             $ content = preg_replace( '#\ {(\ w +)\}#'、 '<?= $ vars [\' \ 1 \ ']?>'、$ content);
             file_put_contents($ file。 '。tpl1.php'、$ content);
         }
         $ vars ['some'] = 'some';
        インクルード$ファイル '。tpl1.php';
     }
    


    結果



    関数は単にループで呼び出され、ファイルシステムアクセスキャッシュは無効になっています。

    試験タイプ

    時間

    スピーディの割合

    file_included0.00021430100.00%

    file_required0.00021500100.33%

    file_evaled0.00022488104.94%

    file_tpl_preg0.00024208112.96%

    file_tpl_strtr0.00022802106.40%

    file_tpl_preg_cashe0.00024305113.42%

    file_tpl_manual_cashe0.00023100107.79%





    結果を説明します。

    1. file_included



      シンプルな包括的なPHPテンプレート、最速

      file_required



      同じ包含、プロファイルのみ

      file_evaled



      -PHPテンプレートを個別に読み取り、実行します。少し遅いです

      file_tpl_preg



      テンプレートを正規表現で解析し、インクルードよりも10〜12%遅い

      file_tpl_strtr



      行のクイック置換を使用した解析、柔軟性のないアプローチ、ただし5〜6パーセント遅い

      file_tpl_preg_cashe



      正規表現の解析とキャッシュの陳腐化の自動チェックによるキャッシング。 速度はキャッシュなしの場合とほぼ同じですが、filemtimeは非常に遅い関数のようです

      file_tpl_manual_cashe



      キャッシュの存在をチェックするだけでキャッシュします(解析のために、古いキャッシュを削除する必要があります)。 かなり良い結果で、インクルージョンよりも6〜7%遅いだけです。





      独自の結論を導きます:)



All Articles