PHP で Hello World ベンチマーク (Pinocoも)
驚きのベンチマークテスト計測結果を報告します。
さまざまなPHP開発プラットフォームで、「何もしていない時にかかるオーバーヘッド」を計測したいと思い、可能な限り余計な処理を省いた Hello World プログラムで、ベンチマークテストを行いました。Webアプリケーションって、同意ページや操作説明など、ほとんど静的なページなんだけど、フレームワークに一部依存するページって、けっこうあるんですよね。そんなところでCPUを消耗しちゃうのはもったいないなと。
実行環境は 2.4GHz Core2 の Mac book で、OS は 10.6 です。
エントリー
Pinocoは主としてビューにPHPTALを使う、非MVCで非OOPな拙作フレームワークです。 http://code.google.com/p/pinoco/
CakePHP
コントローラ
<?php class HelloController extends AppController { var $uses = array(); // モデルなし function index() { $this->layout = ''; // レイアウト使用せず $this->set('message', "CakePHP"); } } ?>
ビュー
<p>Hello <?php echo $message; ?></p>
CodeIgniter
コントローラ
<?php class Hello extends Controller { function Hello() { parent::Controller(); } function index() { $this->load->view('hello', array('message' => "CodeIgniter")); } } ?>
ビュー
<p>Hello <?php echo $message; ?>.</p>
Pinoco(PHPTAL使用)
フック
<?php $this->message = "Pinoco"; ?>
ページ(.html)
<p>Hello ${this/message}.</p>
Pinoco(PHPTALなし)
フック
<?php $this->message = "Pinoco"; $this->page = "index.php"; ?>
ページ(.php)
<p>Hello <?php echo $this->message; ?>.</p>
PinocoはデフォルトのテンプレートエンジンにPHPTALを使いますが、PHPTALエンジンのロードを避けて、ビューを生のPHPで書くこともできます。というわけで、2パターンの Hello World を書きました。
これらのコードに対して、ab で1000リクエスト10本並列接続を行い、1リクエストあたりの所要時間を求めました。
APCなし
PHP | 0.363ms |
CakePHP | 31.094ms |
CodeIgniter | 5.510ms |
Pinoco(PHPTAL使用) | 6.239ms |
Pinoco(PHPTALなし) | 3.755ms |
APCあり
PHP | 0.359ms |
CakePHP | 11.042ms |
CodeIgniter | 2.157ms |
Pinoco(PHPTAL使用) | 2.573ms |
Pinoco(PHPTALなし) | 1.890ms |
ちょwww Pinocoはやっ!!
驚きました。本当に速いです。他のフレームワークがビューとして生のPHPを使っているなか、PinocoはPHPTALをデフォルトとしています。それなのに、PHP界で最速フレームワークと言われ、ビューに生PHPを使っている CodeIgniter と互角にやり合えそうです。いいですか、PHPTALはデフォルトで文字列をエスケープしますよ。TAL系テンプレートエンジンですよ。
しかも、PinocoでPHPTALを使わず、ビューを生のPHPで実装した場合なんて、CodeIgniter に対して 30% ほど高速です。やったーイチバーン!! まあただ、PHPTALのないPinocoの価値はすごく低いので、分けて考えるべきじゃないんですけどね。
たしかに偏ったベンチマークですが、何かしらの特性でトップを取れるということは、Cakeでもなく、CIでもなく、かといって急に生のPHPでもなく、あえてPinocoを選ぶのが最適だと、世界中の人が客観的にそう言えるシチュエーションは、必ずあるはず。
自信を持って言います。デザイン重視の外向きサービスに、Pinoco 超おすすめです。
http://code.google.com/p/pinoco/
でも間違えないでください。この比較は単純なフレームワークの良し悪しを言っているわけではありません。なんでもかんでも、この情報だけを根拠に決めるのは間違いです。まだDBには接続すらしてないんですからね。
Webアプリケーションの各機能がどの程度の密度で使われるのかということ、顧客の要求に応じるにはどのぐらいリッチなライブラリが必要なのかということ、などを考えると、パフォーマンスを優先しないほうがいいケースもあります。
そうそう、なにより、PinocoはそもそもMVCフレームワークではありません。努力してサブモジュールをユニットテストできるように書かなければ、オブジェクト指向的なテストはできませんし、モデルをどうするかもユーザ任せです。ポストJavaとしてPHPを使うような仕事との相性についてはノーコメントです。
まあ、それにしても、生のPHPがどれだけオーバーヘッド低いねん、というのにはいつも驚かされます。スクリプトの実行は遅くても、この起動の速さはやっぱりPHPの武器ですね。HTMLの中にベタ書きでいいぐらいのときは、やっぱりPHPで間違いない。