Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

CGIのベンチマーク

時代に逆らいCGIでのベンチマーク
さくらレンタルサーバのスタンダードプランでPerlを使うにはCGIの選択肢しかないので、
効率のいい書き方を考えてみる。
その前に素の状態のベンチマークを測ってみた。
さすがに共有サーバでベンチマークをとるのは迷惑かけるので、開発用のサーバでやってみた。


次の2つを測ってみた。

  • HTTPヘッダ含め、全て自分の文字列で吐き出す(CGI.pmなし)
  • CGI.pmをuseして、CGIインスタンスを使用し、HTTPヘッダを吐き出す


Perlは5.14.1。CGI.pmは3.55。

コードはこんなん。

CGI.pmなし
#!/usr/local/perl5/perlbrew/perls/perl-5.14.1/bin/perl
print 'Content-type: text/html

<!doctype html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>...</title>

以下150行くらい

  </body>
</html>';
CGI.pmあり
#!/usr/local/perl5/perlbrew/perls/perl-5.14.1/bin/perl
use CGI;
my $q = CGI->new;
print $q->header,
'<!doctype html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>...</title>

以下150行くらい

  </body>
</html>';


並列度100、総数1000でApache Benchした結果。
($ ab -c 100 -n 1000 http://127.0.0.1/cgi-bin/index.cgi

項目 CGI.pmなし CGI.pmあり
Requests per second 263.03 [#/sec] 27.39 [#/sec]

おお、やっぱりCGI.pmで10倍近く遅くなるのだな。
CGIで速度だけを追求するなら、必要がないリクエストでCGI.pmをuseするのは避けた方がいいのかな。



基本は静的htmlで返し、Ajaxで必要なデータをCGIでロード、とかが正しいCGIの使い方としてできるかも。


たぶん続く。