- ベストアンサー
PerlCGIでのサーバー負担
horagaiです。お世話になっております。 PerlCGIでのサーバー負荷の重さについてうかがいます。 (1)サブルーチン hevy1,hevy2,…,は長いスクリプトで、かつ時間のかかる処理とします。CGIを呼び出す時、パラメーター$pを与え、$p=1の時は他のURLへ飛ばし、$p=0のときはその重い処理をするものとします。このとき if($p){ print "Location: http://hogehoge.com/\n\n"; exit; } hevy1; hevy2; ・ ・ sub hevy1{ … となっているのを サブルーチン部分はHevy.plというライブラリーにまとめてしまい if($p){ print "Location: http://hogehoge.com/\n\n"; exit; } require 'Hevi.pl'; Hevi::hevy1; Hevi::hevy2; ・ ・ と書き換えたら、少なくとも$p=1の場合は負荷が軽くなるでしょうか。(mod_perlは使わないとします) (2)htmlを吐き出すのに print "<HTML>\n"; print "<TITLE>$hoge</TITLE>\n"; ・ ・ print "</HTML>; と行毎に出力させるより、ヒヤドキュメントで print <<"EOF" <HTML> <TITLE>$hoge</TITLE> ・ ・ </HTML> EOF とするほうが負荷が軽くなるでしょうか。(ただしキャッシュメモリーは十分にあるものとします) (3) CGIを呼び出して print "<HTML>Hogehoge…</HTML>"; と、書かせるよりも Hogehoge… の部分をhoge.txtに書いておき、SSIを使って <HTML> <!--include file="hoge.txt"--> </HTML> とした方が負荷が軽くなるでしょうか。 どれか1つでもよいので宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
(1) どのみちParseするという点では同じなので、ライブラリとして分ける意味はないです。 逆に、呼び出しにかかる負荷は重いのではないでしょうか。(実質的な違いはないと思いますが。) (2) 同じです。 print文ごときを工夫したところで意味はないです。 (3) 確信はありませんが、print文の方が速そうですね。 HTMLの中でSSIからCGIを呼び出すと、ハンドラのこともありますし、無駄が多いです。 そもそもSSIを有効にすると、HTMLファイルの表示自体が遅くなりますよ。 #1さんの指摘通り、ボトルネックを対処するのが肝心です。 ボトルネック以外の処理は、多少の負荷にこだわるより、可読性、再利用性にこだわった方がよいです。 逆に、可読性や汎用性、再利用性のための技術を、本来の目的以外で使うのは混乱の元です。 再利用も出来ないライブラリを作ったりすると、あとで、意図がわかりにくくなるだけです。
その他の回答 (1)
- nta
- ベストアンサー率78% (1525/1942)
「長い処理」というと数値解析を延々と実行するというのはまずなくて、ほとんどデータベース操作であったり、他のサーバの呼び出しであったりというメモリー上で解決できず、ハードディスクや通信I/Oを呼び出す処理を含む場合ではないかと思います。そうなると(1)のようなPerlスクリプト本体をメモリー上に読み出す処理などほとんどゴミのようなものです。どんなプログラム構成にしても優位な差はありません。プログラムを快適に動作させるためにはボトルネックである重い処理を改善するというのが定石です。 (2)(3)は不明ですが、測定しても大差が出ないのではないかと思います。
お礼
ありがとうございます。 >データベース操作であったり、 まさにその通りです。 >プログラムを快適に動作させるためにはボトルネック >である重い処理を改善するというのが定石です。 了解しました。処理の内容を再検討してみます。
お礼
ありがとうございます。 >ボトルネック以外の処理は、多少の負荷にこだわるより、 >可読性、再利用性にこだわった方がよいです。 わかりました。そのような方針で再検討してみます。