無料スクリプトならphp.to

PHPスクリプト無料配布所 :: PHP.TO







アクセスアップ・上位表示ならSEO.CUG.NET
安くて早い!SEOに強いコーディング代行サイト AcodeZ(アコーズ)
無料スクリプトならphp.to PHPスクリプト無料配布!php.to
リンクはご自由に


0010. mod_perlは本当に速いのか?
<< 0009. 携帯電話端末用GPS機能を利用した緯度経度情報の利用方法(その1)
昔から、PHPとPerlはよく比較されてきました。

通常のPerlはCGIで動くので、httpdのモジュールとして動くPHPと比べたら起動のオーバヘッドのために「遅い」と言うのが通説でした。

そんな頃、川合さんのPerlよりPHPの方が軽くて速いは本当?PerlよりPHPの方が軽くて速いは本当?の情報へ というページでは「PHPと同じほぼ仕組みで動くmod_perlならPerlのほうが速い」という結論が出されていました。
このページは2002年から影響力が大きく「やっぱPHPよりPerlだよね」という風潮が吹いたこともありました。(小飼さんの404 Blog Not Found404 Blog Not Foundの情報へ のページもこちらの結果を参考にしているようです)

ただ、当時から私が疑問に思っていたのは、上記サイトのベンチでは「mod_perlはアクセラレータであり、実行コードをキャッシュする」ことを考慮していないことです。
mod_phpはCGI版のPerlと同様にアクセラレータを通さずに毎回コンパイルが行われるのにも関わらず、です。

それに加え、Perlは必要なモジュールのみを実行時に use でロードすれば良いのですが、PHPではその性質上、モジュールのコンパイル時にリンクさせてやる必要があります。
この結果、mod_phpをロードしたhttpdは1プロセスあたりのサイズが増加し、最小単位で動作が可能なmod_perlに比べると、「軽い」とは言えないのも確かです。

よって、上記のようなテストを行うのであれば、PHP側では
「./configure時に必要最低限の機能しかenabledにしない。(どうしても拡張モジュールを使う場合は、dldlのマニュアルへ でロードする)」
「APCやXCacheなどのアクセラレータ(実行コードキャッシュモジュール)を追加する」
という設定を事前に行うか、そもそもCGI同士で比較するべきだったのではないでしょうか。

私の経験では、上記設定を行った後にmod_perlとmod_phpでもう一度同じベンチマークを行えば、おそらくPHPの方が早いように思います。

ただし、私はPerlがPHPに比べて劣っていると言うつもりは全くありません。

そもそも言語自体が作られた経緯が違いますので、「何でも出来て、たまたまWEBにも対応できるから使われてきたPerl」と、「ほぼWEBだけに特化した作りのPHP」では、後者の方がWEB用途においては優れていて当たり前だからです。
レガシーな技術とportされるモジュールだけで10年以上も第一線でやっていけるPerl5は素晴らしいとさえ思います。

mixiやlivedoor、はてな、slashdotなどではmod_perlが使われていることもあって、最近はOSSでの大規模サイトではmod_proxy + mod_perlを利用したサイトの構築が増えてきているように思います。

Java Servlet,PHP,Apache moduleベンチマークJava Servlet,PHP,Apache moduleベンチマークの情報へ のページやITmediaの記事ITmediaの記事の情報へ など、Perl(CGI/mod_perl)とPHPを比較したベンチマークをたまに見かけて、非常に興味深い結果を見ることができますが、ほとんどが単純ループで簡単な処理を行うだけのものが多く、実際の業務のことを考えると、残念ながらあまり参考にならないことが多いです。

というのも、本来プログラムと言うのは「極力、ループを使ってはならない」ものだと思うからです。
(詳細な説明は省きますが、これはクイックソートとバブルソートの実行速度の差を考えれば明らかで、アセンブラの時代から速度を追求するプログラマは単純ループよりも美しいアルゴリズムで高速化を行ってきました。今はCPUが高速化されているので、そんなことお構いなしに強引にループでぶん回す人も沢山いるようですが、新人プログラマとウィザードの差はここで出ると思います)

本来であれば、実運用予定のシステムのシナリオに沿った、ファイルI/Oの速度やデータベースからのfetch速度、連想配列やオブジェクト操作などの複数の要素に対しての「実践的なベンチマーク」を行う必要があるように思います。

そこで、私がよくあるシステム構成で使われるような「実践的なベンチマーク」をやってやろうと考えて色々と環境構築を行っていたのですが、途中であることに気づいてベンチマークは取りやめることにしました。

何故かと言うと、試しに単純ループでベンチマークを取ってみたところ、Perl5.8とPHP4.3の頃はPerlの方が1.5〜2倍度速速いくらいだったのに、Perl5.8とPHP5.2とではPHPの方が1.5倍程度速いという結果が出たからです。
PHP5.0が出た頃はPHP4よりも遅いと言われていて、PHP5.1以降は高速化されたとは聞いていましたが、正直ここまでとは・・・。

こちらは純粋にコマンドラインから実行したものの速度であって、HTTPベース(つまりCGIやmod_perl/mod_php)での実行速度ではないのですが、既に言語仕様(というかインタプリタ)自体でこれだけ速度差が出ている状況では、モジュール云々以前の問題で、もはやベンチマークになりません

もし要望があれば改めてmod_phpとmod_perlの比較をやってみようと思いますが、言語のバージョンの他にも、コードの書き方にもかなり依存することになるので、あまり意味がないような気がします。

とりあえずここでの結論は、現状では「mod_perl隆盛の時代ですが、PHP使いの人にはmod_phpで問題はなさそうである」ということでしょうか。

もっとも、Perl6/Parrotになると話は変わってくるのかもしれませんがね。


#ちなみに、実行したコードはこんなかんじこんなかんじの情報へ の非常に単純なものです。

>> 0011. 携帯電話端末用GPS機能を利用した緯度経度情報の利用方法(その2)
track back URL : http://php.to/tips/10/trackback/

コメント

コメントはまだありません


よろしければコメントをどうぞ ※spam防止のため、半角英数字のみの投稿はできません
お名前(必須):
URL:
コメント(必須):

パソコンメーカーのデル
XPS 15z
Vostro 3750

- SEO.CUG.NET :: スクリプト配布チーム -