【php】eval() が意外と遅くない。むしろ速い。
私は今まで eval() は、反則技、変則的処理のようなイメージを持ってました。
インタプリタ言語ならではな感じですし、ものすごく遅いのでは?と思ってました。
ところが、イメージに反して phpの eval()が遅くない。むしろ速い。
実験
次のような感じで、クラスをc1~c10000まで、c1.php~c10000.phpのファイルで定義します。
c1.php → class c1 {var $test;}
c2.php → class c2 {var $test;}
c3.php → class c3 {var $test;}
……
…
ファイルが10000個、クラスが10000個。
include用には <?php をつけて、 eval()用には、開始タグ、終了タグはつけません。
・includeの場合
for ($i = 1; $i <= 10000; ++$i) { include 'c' . $i . '.php'; }
・eval()の場合
for ($i = 1; $i <= 10000; ++$i) { eval(file_get_contents('c' . $i . '.php')); }
・実行時間
include → 3.5秒ぐらい
eval() → 2.8秒ぐらい
includeのときは開始コード”<?php “の分だけ6バイトファイルが大きいことに今さら気づきましたが、それでもeval()は全然遅くないことが分かります。
うーん。思い込みで判断してはいけなかったです。
これなら、ソースコードをファイルで持つ必要もないのでは?なんてアイデアも浮かびます。
ソースはすべてデータベースに格納して、すべて eval() で実行するなんてフレームワークもありですね。
SQLでソースが更新できます。
全部データベースに入れるのは行き過ぎとしても、画面表示用のテンプレートをデータベースに格納すれば、CMSなどでは管理画面から触りやすくなります。
しかもeval()でレンダリングするからphpが実行できる。
おもしろいなぁ。
すでに drupal の php filter などで実装されてそうですが、これで私も抵抗なく使えます。
コメント