Entry

プログラミングメモ - C++ 版 Web コンテナの性能調査

2009年03月21日

少しまとまったので,Perl の CGI と比較してみることにしました。環境は以下のようなモノ。

  • CPU: Intel Pentium M 1GHz
  • RAM: 1.24 GB
  • OS: Windows xp pro.
  • HTTPD: Apache/2.2.11
  • Perl: ActivePerl v5.10.0 built for MSWin32-x86-multi-thread
  • C++-Complier: Borland C++ 5.5.1 for Win32 (-O2 で最適化)

今 FreeBSD BOX がぶっ壊れてるので,Windows が入ったショボノート上で検証しています。あんまり厳密にやってないので,参考程度ということで。

試してみたのは次のスクリプト。C++ のコンテナが,環境変数やクエリを整えることしかやっていないので,Perl 上も CGI インスタンスを作るところまでしかやっていません。

#!c:/home/aian/tool/perl/bin/perl

use strict;
use warnings;

use CGI;

my $q = new CGI;

print $q->header('text/html');
print '<html><head><title>Perl test</title></head><body>OK</body></html>';

普通に"OK"と表示するだけ。でも,CGI オブジェクトは起動時に環境変数等々を整えてます。C++ 版の方は,環境変数とクエリを解析していて(std::map に詰め込んでいる),プログラムの場所(argv[0])を出力しているんですけれど,コードがバカでかくなっちゃったので省略します。もう少し使えるようになったら紹介するかも。

検証には ApacheBench を使いました。まずは Perl 版の結果。

C:\home\aian\tool\apache\bin>ab -n 2000 -c 10 http://localhost/perl.cgi
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 200 requests
Completed 400 requests
Completed 600 requests
Completed 800 requests
Completed 1000 requests
Completed 1200 requests
Completed 1400 requests
Completed 1600 requests
Completed 1800 requests
Completed 2000 requests
Finished 2000 requests


Server Software:        Apache/2.2.11
Server Hostname:        localhost
Server Port:            80

Document Path:          /perl.cgi
Document Length:        65 bytes

Concurrency Level:      10
Time taken for tests:   327.219 seconds
Complete requests:      2000
Failed requests:        0
Write errors:           0
Total transferred:      432200 bytes
HTML transferred:       130000 bytes
Requests per second:    6.11 [#/sec] (mean)
Time per request:       1636.094 [ms] (mean)
Time per request:       163.609 [ms] (mean, across all concurrent requests)
Transfer rate:          1.29 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   3.8      0      47
Processing:   797 1632 121.5   1625    2578
Waiting:      797 1609 112.9   1609    2578
Total:        797 1633 121.6   1625    2578

Percentage of the requests served within a certain time (ms)
  50%   1625
  66%   1672
  75%   1688
  80%   1719
  90%   1766
  95%   1828
  98%   1906
  99%   1984
 100%   2578 (longest request)

続いて C++ 版の結果。

C:\home\aian\tool\apache\bin>ab -n 2000 -c 10 http://localhost/foo.cgi
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 200 requests
Completed 400 requests
Completed 600 requests
Completed 800 requests
Completed 1000 requests
Completed 1200 requests
Completed 1400 requests
Completed 1600 requests
Completed 1800 requests
Completed 2000 requests
Finished 2000 requests


Server Software:        Apache/2.2.11
Server Hostname:        localhost
Server Port:            80

Document Path:          /foo.cgi
Document Length:        90 bytes

Concurrency Level:      10
Time taken for tests:   39.250 seconds
Complete requests:      2000
Failed requests:        0
Write errors:           0
Total transferred:      442000 bytes
HTML transferred:       180000 bytes
Requests per second:    50.96 [#/sec] (mean)
Time per request:       196.250 [ms] (mean)
Time per request:       19.625 [ms] (mean, across all concurrent requests)
Transfer rate:          11.00 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   3.3      0      16
Processing:    31  195  40.3    188     391
Waiting:       31  183  29.0    188     359
Total:         31  196  40.2    188     391

Percentage of the requests served within a certain time (ms)
  50%    188
  66%    203
  75%    203
  80%    203
  90%    234
  95%    266
  98%    313
  99%    344
 100%    391 (longest request)

当初,C++ 版のベンチしかとってなかったもんで,苦労した割には遅いなぁ,と思ってたんですけど,やっぱり C++ 版の方が速かった。Perl 版と比べると,C++ 版の時間当たりに処理できるリクエスト数(Requests per second)は約8.34倍多い。起動時に限った話で言うと,圧倒的に速いようです。

もっとも,ここら辺については,オーバーヘッドを低減するノウハウが蓄えられています。んなもんで,だから Perl はダメなんだってな話にはならないし,そんなことを言うつもりもありません。目的は,C++ 版を作る意味があるんかいな,といったところなので,とりあえず目的はクリアしたといったところ。

これからもコツコツ作るですよ。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN