VBやVC++によるCGI, ASPやISAPIなどによる違い等を測定してみました。 解析者 古口正巳 1998.7.26更新 次のような環境で試験は行いました。 いずれも自作機ですので結果は参考程度に考えてください。 自作1号機(Name:P6) CPU:Pentium Pro 200MHz(66MHz*3) M/B:ASUStec TP6X6(440FX) 2nd Cash 256KB on CPU SIMM:128MB(32*4 EDO) NIC:Intel Ethernet PRO100 HDD:Quantum bigfoot 6.4(E-IDE) OS:Windows 95 IE 4.01 IIS:IIS 4.0(NT Option pack1) 自作5号機(Name:P2) CPU:Pentium II celeron-266 450MHz(112*4 Vcore=2.2V) M/B:ASUSstec P2B(440BX) 2nd Cash None DIMM:256MB(PC-100 SD-RAM cas=3) NIC:Intel Ethernet PRO100 HDD:Quantum fireboll SE 8.4(U-ATA) OS:Windows NT 4.0 Workstation IE 4.01 IIS:IIS 4.0(NT Option pack1) 両者をクロスケーブル(C5)でつないで双方をサーバー・クライアントに交互に設定して行いました。 前回のテストとp6のNICとp2のメモリーの搭載量が異なります。 結果は示しませんがp6のNICを交換するだけで1.8倍パフォーマンスが向上しました。 やっぱり安物のNICはCPU負荷率が高いようです。 使用ソフト:自作 vbcgbnch V9.1(http://www.sf.airnet.ne.jp/koguchi/)  記録はWindowsに付属のパフォーマンスモニターやシステムモニターを使用しました。 結果および考察(個人の感想)  コードサイズCPU占有率 サーバー(%/回) OKが返された数(分割送信数,エラー数) 実行回数 html 178byte CPU S 4.2%(0.313%) C 80%(6.0%) OK 10048(Split 0) 13.4回/秒 ASP(Buffer) 437byte CPU S 6.4%(0.457%) C 90%(6.4%) OK 10049(Split 189) 14.0回/秒 ASP(LINE) 412byte CPU S 6.9%(0.647%) C 80%(5.6%) OK 10047(Split 1561) 13.9回/秒 ASP(ActivX) 96+9728B CPU S 12.7%(0.784%) C 90%(5.6%) OK 10049(Split 54) 16.2回/秒 VBCGI(Buffer) 8704byte CPU S 70% (3.954%) C 90%(5.1%) OK 10049(Split 7169) 17.7回/秒 VBCGI(LINE) 8704byte CPU S 66% (4.258%) C 95%(6.1%) OK 10046(Split 6397) 15.5回/秒 VC++CGI(LINE) 83968byte CPU S 20% (1.226%) C 95%(5.8%) OK 10047(Split 1032) 16.3回/秒 VC+ISAPI(BUF) 44544byte CPU S 4.8%(0.267%) C 95%(5.3%) OK 10048(Split 64) 18.0回/秒 ASP(ActivX)*1 96+9728B CPU S 62% (2.707%) C 90%(3.9%) OK 9695(Split 40, ERROR403 353) 22.9回/秒 URL ERROR CPU S 5.8%(0.294%) C 95%(4.8%) OK 10049(Split 0) 19.7回/秒 PerlIS(LINE) 340byte CPU S 13.0%(0.935%) C 80%(5.8%) OK 10049(Split 1936) 13.9回/秒 注:*1はトランザクションサーバーに接続したとき 同じ事を何回も書いて恐縮ですがサーバーがNT4.0 WS IIS4.0のため同時接続10による制限が多くの試験で示されてます。 1回の処理当たりのCPU占有率で解析してみたいと思います。 試験に用いた出力文字数が少なすぎて解析が難しいようです。そのうち暇があったら長文にもトライしてみます。 クライアント側は100%に達しておらずサーバーの能力がフルに発揮されたと思われます。  まずHtml形式の読み込みであるが0.313%/回と非常に高速でした。別試験で示したように7KBのテキスト転送でもほとんど 速度低下は認められてません。  次にASPですが全文一括出力でhtmlより1.5倍程時間がかかってます。一行ずつ出力すると2倍時間がかかってます。  Response.Buffer = True, Response.Flush(END)やIISのバッファリングをオンにするとパフォーマンスアップが望めるでしょう。  次にASPからVBで作成したActiveX DLLを呼び出した場合です。ASPに比較するとやや遅くなってます。  しかし,これをトランザクションサーバーに登録すると前回も報告したとおりCPUパワーは4倍程使用してしまいますが, 動作速度が2倍程度改善してみます。CPUパワーが余っていて高速動作が必要な場合は有効だと思います。  次にVBCGIですが全文・一行出力ともにASPの十倍程度の時間がかかってます。VBCGIは資源の浪費が多いと考えられます。 VBCGIを使用するよりクッキーやフォームデーターをASPから受けてActiveX DLLで書いた方が良いのではと思われました。  次にC++ CGIですが,ASPより2−3倍程度遅く,VBCGIとASPの丁度中間の結果となりました。コードサイズが大きい のも気になりますが,やはりCGIは負担が大きいということでしょう。  最後にC++で書いたISAPIですが,なんとHtmlを越えるスピードで実行されてしまいました。  ASPの2倍といったところでしょうか。 PerlISのパフォーマンスはASPよりやや劣った。  以上をまとめていくと,資源を消費せずに高速に動作させるならC++のISAPIを用いるのが良いということになります。  次に速いのはASPでバッファー処理を有効に使う必要があるでしょう。  コード等を隠す必要があればVB等でのActiveX DLLも高速に動作します。    しかし残念ながらVC++やVBによるCGIはパフォーマンスが劣るようです。  特にVBCGIは最低でした。Perlとの比較もできたらと考えてます。    今回の試験ではテキスト処理だけでしたのでHTML文より速い場合がみられますが,ファイルを読み書きするだけで数倍の パフォーマンスを消費します。必要がある時以外はASPやCGIはできるだけ使わないのがベストと思われます。  さらにDBシステムもファイルの読み書きよりも2−4倍のパフォーマンスを使用しますので注意しましょう。 まとめ  ASPが最善の選択でどうしても高速に動作させたい場合はISAPIを用いるのが良いようです。 さらにASPを用いる場合はバファリングの設定をして  インクルードファイルを有効に用いプログラム自体にデーターを書き込み出力する。  テキスト変数に全文をしまい,htmlファイルを書き換えて必要な時以外CGIを実行しない。(Response.Redirect等の利用) などの工夫が必要でしょう。  この結果はあくまでも条件を限定した結果であります。  コードが大きくなってシステム等にキャッシュされない状態(実際のサーバー運用)での速度を示すものではないことにも 注意しましょう。  また考察も個人的な感想であり事実と異なることがあります。  実験・解析・報告者 古口正巳 1998.07.26 (koguchi@sf.airnet.ne.jp http://wwww.sf.airnet.ne.jp/koguchi/) 1.単純なhtmlファイルの読み込み 178byte CPU占有率 サーバー(%/回) クライアント(%/回) OKが返された数(分割送信されてきた数,エラー数) CPU S 4.2%(0.313%) C 80%(6.0%) OK 10048 13.4回/秒 VB4CGI BENCH V0.91 解析結果 解析日付   : 98/07/25 8:20:17 ホスト    : P2 ポート    : 80 クライアント数: 50 実行間隔(ms) : 1000 最大回数   : 10000 出力文字列  : GET /gerogero.htm HTTP/1.0 経過時間   : 751 受信(byte)  : 8,138,880 (byte/s)   : 10,837 実行回数   : 10048 (byte/回)   : 810 回/sec    : 13.4 2.ASP(Buffer) 437byte CPU S 6.4%(0.457%) C 90%(6.4%) OK 10049(Split 189) 14.0回/秒 VB4CGI BENCH V0.91 解析結果 解析日付   : 98/07/25 8:37:58 ホスト    : P2 ポート    : 80 クライアント数: 50 実行間隔(ms) : 1000 最大回数   : 10000 出力文字列  : GET /aspsamp/gerogero.asp HTTP/1.0 経過時間   : 717 受信(byte)  : 7,576,946 (byte/s)   : 10,553 実行回数   : 10049 (byte/回)   : 754 回/sec    : 14.0 3.ASP(LINE) 412byte CPU S 6.9%(0.647%) C 80%(5.6%) OK 10047(Split 1561) 13.9回/秒 VB4CGI BENCH V0.91 解析結果 解析日付   : 98/07/25 8:53:40 ホスト    : P2 ポート    : 80 クライアント数: 50 実行間隔(ms) : 1000 最大回数   : 10000 出力文字列  : GET /aspsamp/gerogero2.asp HTTP/1.0 経過時間   : 725 受信(byte)  : 7,334,310 (byte/s)   : 10,116 実行回数   : 10047 (byte/回)   : 730 回/sec    : 13.9 4.ASP(Active X DLL) 96byte + 9,728byte CPU S 12.7%(0.784%) C 90%(5.6%) OK 10049(Split 54) 16.2回/秒 VB4CGI BENCH V0.91 解析結果 解析日付   : 98/07/25 9:07:13 ホスト    : P2 ポート    : 80 クライアント数: 50 実行間隔(ms) : 1000 最大回数   : 10000 出力文字列  : GET /aspsamp/geroout.asp HTTP/1.0 経過時間   : 619 受信(byte)  : 7,576,946 (byte/s)   : 12,221 実行回数   : 10049 (byte/回)   : 754 回/sec    : 16.2 5.VBCGI(Buffer) 8,704byte CPU S 70%(3.954%) C 90%(5.1%) OK 10049(Split 7169) 17.7回/秒 VB4CGI BENCH V0.91 解析結果 解析日付   : 98/07/25 9:19:12 ホスト    : P2 ポート    : 80 クライアント数: 50 実行間隔(ms) : 1000 最大回数   : 10000 出力文字列  : GET /scripts/geroout.exe HTTP/1.0 経過時間   : 566 受信(byte)  : 5,748,028 (byte/s)   : 10,138 実行回数   : 10049 (byte/回)   : 572 回/sec    : 17.7 6.VBCGI(LINE) 8,704bytre CPU S 66%(4.258%) C 95%(6.1%) OK 10046(Split 6397) 15.5回/秒 VB4CGI BENCH V0.91 解析結果 解析日付   : 98/07/25 9:44:14 ホスト    : P2 ポート    : 80 クライアント数: 50 実行間隔(ms) : 1000 最大回数   : 10000 出力文字列  : GET /scripts/gerogero.exe HTTP/1.0 経過時間   : 648 受信(byte)  : 5,746,312 (byte/s)   : 8,854 実行回数   : 10046 (byte/回)   : 572 回/sec    : 15.5 7.VC++CGI(LINE) 83,968bytre CPU S 20%(1.226%) C 95%(5.8%) OK 10047(Split 1032) 16.3回/秒 VB4CGI BENCH V0.91 解析結果 解析日付   : 98/07/25 9:56:37 ホスト    : P2 ポート    : 80 クライアント数: 50 実行間隔(ms) : 1000 最大回数   : 10000 出力文字列  : GET /scripts/geroc.exe HTTP/1.0 経過時間   : 616 受信(byte)  : 5,867,448 (byte/s)   : 9,525 実行回数   : 10047 (byte/回)   : 584 回/sec    : 16.3 8.VC++ISAPI (BUFFER) 44,544bytre CPU S 4.8%(0.267%) C 95%(5.3%) OK 10048(Split 64) 18.0回/秒 VB4CGI BENCH V0.91 解析結果 解析日付   : 98/07/25 10:07:52 ホスト    : P2 ポート    : 80 クライアント数: 50 実行間隔(ms) : 1000 最大回数   : 10000 出力文字列  : GET /scripts/geroisapi.dll HTTP/1.0 経過時間   : 558 受信(byte)  : 6,028,800 (byte/s)   : 10,804 実行回数   : 10048 (byte/回)   : 600 回/sec    : 18.0 9.ASP(Active X DLL) 96byte + 9,728byte トランザクションサーバーに登録 CPU S 62%(2.707%) C 90%(3.93%) OK 9695(Split 40, ERROR 403 353) 22.9回/秒 VB4CGI BENCH V0.91 解析結果 解析日付   : 98/07/25 10:29:58 ホスト    : P2 ポート    : 80 クライアント数: 50 実行間隔(ms) : 1000 最大回数   : 10000 出力文字列  : GET /aspsamp/geroout.asp HTTP/1.0 経過時間   : 437 受信(byte)  : 7,691,976 (byte/s)   : 17,562 実行回数   : 10048 (byte/回)   : 766 回/sec    : 22.9 10.PerlIS(LINE)ファイルの作成 エディッタ使用 VB4CGI BENCH V0.91 解析結果 解析日付   : 98/07/27 20:27:18 ホスト    : P2 ポート    : 80 クライアント数: 50 実行間隔(ms) : 1000 最大回数   : 10000 出力文字列  : GET /scripts/test.pl HTTP/1.0 経過時間   : 721 受信(byte)  : 5,748,028 (byte/s)   : 7,961 実行回数   : 10049 (byte/回)   : 572 回/sec    : 13.9 番外編 URL ERROR 6.VBCGI(LINE) 8,704bytre -> GETの指定ミスで400Errorが帰ってきていた。 CPU S 5.8%(0.294%) C 95%(4.8%) OK 10049(Split 0) 19.7回/秒 VB4CGI BENCH V0.91 解析結果 解析日付   : 98/07/25 9:30:17 ホスト    : P2 ポート    : 80 クライアント数: 50 実行間隔(ms) : 1000 最大回数   : 10000 出力文字列  : GET/scripts/gerogero.exe HTTP/1.0 経過時間   : 511 受信(byte)  : 4,501,952 (byte/s)   : 8,810 実行回数   : 10049 (byte/回)   : 448 回/sec    : 19.7  この結果はあくまでも条件を限定した結果であります。  また考察も個人的な感想であり事実と異なることがあります。  実験・解析・報告者 古口正巳 1998.07.26 (koguchi@sf.airnet.ne.jp http://wwww.sf.airnet.ne.jp/koguchi/)