CGI.pmは重い
今更な話なのですが、いつもお世話になっているCGI.pmには、ものすごくたくさんの機能があることを最近初めて知りました。いつも、単に「フォームから渡されたパラメータを取得すること」にしか使っていなかったんですが、そのためだけのモジュールではないんですね…(ホント今更な話ですみません(笑))
それとは別に、最近初めて知ったものに、mod_perlやSpeedyCGIというのがあります。通常、Perlで書かれたCGIは、呼び出される度にコンパイルされて、そして実行されるんですが、mod_perlやSpeedyCGIは、一度コンパイルしたプログラムをそのまま残しておいて、次回以降のコンパイルプロセスを省くことにより、CGIの動作を高速化することができます。場合によっては数十倍も速くなるらしく、それはそれでかなりすごいのですが、そもそも実際のプログラムの実行ではなく、コンパイル時のコストがこんなに大きいってのが驚きです。
話し戻ってCGI.pmです。先ほども書いたように、大したことに使ってないのに、この巨大なモジュールを毎回コンパイルしているのは、かなり無駄が大きそうです。そこで試しに、このCGIをCGI.pmを使わないように書き直して、ab(Apache Bench)でベンチをとってみたら、なんと約4倍も速くなりました。おそらくこれはかなりレアなケースだと思いますが、大変な違いですね。「車輪の再発明」は良くないかもしれませんが、車輪一つが必要な時に10tトラック持って来るのも品がありません(この例えも品がないけど(笑))。
CGI.pmの軽量版モジュールにCGI::Minimalっていうのもあります。
CGI::Minimal – A lightweight CGI form processing package – search.cpan.org
http://search.cpan.org/dist/CGI-Minimal/lib/CGI/Minimal.pod
ベンチが載っているので引用します。
CGI.pm (3.05) via standard CGI - 16 fetches per second CGI::Simple (0.075) via standard CGI - 20 fetches per second CGI::Deurl (1.08) via standard CGI - 36 fetches per second CGI::Thin (0.52) via standard CGI - 38 fetches per second CGI::Lite (2.02) via standard CGI - 52 fetches per second CGI::Minimal (1.16, :preload) via standard CGI - 52 fetches per second CGI::Minimal (1.16) via standard CGI - 66 fetches per second cgi-lib.pl (2.18) via standard CGI - 71 fetches per second null Perl script via standard CGI - 103 fetches per second null C program via standard CGI - 174 fetches per second CGI::Simple (0.075) via mod_perl - 381 fetches per second CGI.pm (3.05) via mod_perl - 386 fetches per second CGI::Minimal (1.16) via mod_perl - 417 fetches per second null Perl script via mod_perl - 500 fetches per second
なかなか良さそうですが、このサイトが使っているさくらのサーバには入っていませんでした。ちょっと残念…
[追記 2011/10/19]
さくらのスタンダードなら、自分でインストールすることはできると思います。
local::lib を使って、自分のローカルにインストールできるよ。
匿名 - 2011/10/18 02:52
私の書き方がちょっとあれでした。すいません。
おっしゃられるとおり、自分で入れればいいだけですね(実際私も、CGI::Minimalではない他のモジュールですが、自分で入れて使っています)。
local::libは初めて知りました。勉強になります。
kingfisher - 2011/10/19 20:33
CGI.pmって重いって話だけど
mod_perl上で動かすとかなり速くなりますな。
standard CGIではドベだったのに
mod_perlに乗せるとCGI::Simpleより速くなるってとこが面白い。
貴重なベンチ、ありがとうございます。
ばしくし - 2011/10/30 18:10