時代に逆らい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の使い方としてできるかも。
たぶん続く。