[PHP-users 29097] Re: Smarty の導入について

Yasuo Ohgaki yohgaki @ ohgaki.net
2006年 4月 25日 (火) 17:46:26 JST


大垣です。

正規表現は基本的に重い処理です。簡単な比較で分かります。
より現実的な比較(と言っても単純化しすぎていますが)では10倍以上、置換型が
遅くなる可能性が分かります。

hirouserpgm @ yahoo.co.jp wrote:
> 廣瀬です
> 効率わるいですか。
> 下ソースの結果 1000個の置換です
> start 0.72026500 1145633110
> end 0.86440100 1145633110
> 0.144136
> ちなみに、テンプレートのベンチマーク
> http://www.massassi.com/bTemplate/benchmarks/
> 
> <?php
> $search=array();
> $replace=array();
> for($i=0;$i<1000;$i++){
> 	$doc.='{#'.$i.'}'.'abcdefghijklmnopqrstuvwxyz<BR>';
> 	array_push($search,"'".'{#'.$i.'}'."'si");
> 	array_push($replace,'【置換No'.$i.'】');
> }
> $time_start = microtime();
> echo "start $time_start <br>";
> //------------------------------------------------------------------
> 処理
> $replace_doc=preg_replace($search, $replace,$doc);
> //------------------------------------------------------------------
> $time_end = microtime();
> echo "end $time_end <br>";
> echo $time_end-$time_start;
> echo "<br>";
> echo $doc;
> echo
> '--------------------------------------------------------------------------------------<br>';
> echo $replace_doc;
> ?> 


Webのコード性能のベンチマークを取る場合、単独のスクリプトの性能も参考になりますが、正しく
性能を理解するには実際に近い形で複数クライアントで十分な回数の処理を行う必要があります。

正規表現による置換型が遅い可能性があるというのは、正規表現置換型のコードを単純化すると

echo preg_replace(....)

として出力する事になります。一方、コンパイル型(Smartyもコンパイル型)は文書中で

<?php echo ...?> ....
<?php echo ...?> ....

の様にechoが文書に埋め込まれる形になります。少し整理して両者をpreg.php, echo.phpとして
ベンチマークしました。以下がそのコードです。

[yohgaki @ dev template-bench]$ cat -n preg.php
     1  <?php
     2  for($i=0;$i<1000;$i++){
     3          $doc.='{#'.$i.'}'.'abcdefghijklmnopqrstuvwxyz<BR>'.PHP_EOL;
     4          $search[] = '/{#'.$i.'}/';
     5          $replace[] = 'REPLACED '.$i.' ';
     6  }
     7
     8  $replace_doc=preg_replace($search, $replace, $doc);
     9
    10  echo $replace_doc;
    11  ?>
    12
[yohgaki @ dev template-bench]$ cat -n echo.php
     1  <?php
     2  $doc = '';
     3  for($i=0;$i<1000;$i++){
     4          $doc.='<?php echo $replace['.$i.'] ?> abcdefghijklmnopqrstuvwxyz<BR>'.PHP_EOL;
     5          $search[] = '/{#'.$i.'}/';
     6          $replace[$i] = 'REPLACED '.$i.' ';
     7  }
     8
     9  file_put_contents('/tmp/template-test.php', $doc);
    10
    11  require '/tmp/template-test.php';
    12  ?>
    13


echo.phpは公平にするために不必要な配列作成おも行い、テンプレートファイルも
不必要に毎回保存しています。この意味では少しだけecho.phpの方が不利と言えます。

 ab -c 50 -n 1000 http://dev/~yohgaki/template-bench/preg.php
 ab -c 50 -n 1000 http://dev/~yohgaki/template-bench/echo.php

とすると実行時間は

Time taken for tests:   81.786107 seconds (preg.php)
Time taken for tests:   6.131935 seconds  (echo.php)

となります。

Smartyなどの場合、テンプレートシステムだけでもかなりの行数になること、
バイトコードキャッシュ(APCなど)を使用しても、かなりの部分が動的に処理されるPHP
ではキャッシュの読み込みも負荷が高いこと、もあり実際にはどちらが速くなるかは分
かりません。(コード、テンプレート、その他の状況による)

しかし、この単純なベンチマークからも分かるように正規表現による置換はそれほど速く
ない事が分かります。

複雑なテンプレートが必要ないのであればsimplate(コードを読んだのはこれだけなので)
の様にモジュール型で正規表現を使用せずに置換するテンプレートエンジンの性能が良いと
思います。

複雑な事をしないなら

<?php e($var) ?>

の様にPHPコードを埋め込むのが一番手っ取り早く、しかも速いと思います。

--
Yasuo Ohgaki




PHP-users メーリングリストの案内