CGI-BBS > CGI > Perl > なるべく高速に処理させたいのですが


カレッヂ
カレッヂ


質問者 ひこ  投稿日 2/9(金) 17:16:48
(1).print文をいっぱい羅列するのと、
print <<"EOF";
EOF
で処理させるのとでは、どちらが速いのでしょうか?
(2).<FORM>の際のPOSTとGETどちらが速いのでしょうか?
(3).$|=1;を記述しておくと、なにか良い事あるのでしょうか?

少しでも処理の速度を速くしたいのです。
特に、テレホタイムは重くって画面の表示もままなりません(涙)
当たり前の事でもいいので、何か方法があったら教えてください。
回答者 しあわせのツボ  [削除]  投稿日 2/9(金) 18:14:50
(1) ヒアドキュメントの方が速いそうです。print $a,'111',$b,'222'; などのように1文でまとめてprintさせるのも同等の速度が望めます。また、変数がない部分なら "文字列" でなく '文字列' にした方がいいかもしれません。
(2) 処理速度は殆ど違わないと思います。ただ、両方からデータを与えるのはオーバーヘッドがあると思います。
(3) printしたものがバッファされず即座に送信されます。書かなかったからと言って不具合が出ることはまずありませんが、書いた方が安全でしょう。
質問者 ひこ  [削除]  投稿日 2/9(金) 19:14:53
回答ありがとうございますv
早速試してみます。
ホントにありがとうございました(ペコリ)
回答者  [削除]  投稿日 2/9(金) 22:14:26
(3)に関してはこんなのが見つかりました。↓
http://www.wakusei.ne.jp/twn/lng/red/wwwlng.cgi?show+200005/00050127.txt
回答者 さくら  [削除]  投稿日 2/10(土) 01:53:21
(2)GET と POST は perl とは直接関係無く、
HTTP の仕様で決められているリクエストメソッドの事です。
基本的には、
GET はリソースを要求するメソッドです つまりページそのものですね。
POST は情報を送信する為のメソッドです。

こう書くとPOSTの方が早そうですが、CGI の場合、WEBサーバーは
POSTで送られたデータをCGIプログラムに渡します。
そしてそのプログラムが返したリソースをレスポンスとしてクライアントに返します。
GETでは、データは環境変数に格納して、CGIプログラムにリソースを要求します。
そしてそのプログラムが返したリソースをレスポンスとしてクライアントに返します。

で、結局どっちがはやいの?
WEB サーバの処理速度は殆ど変わらないと思います。
ゴメンナサイ! 答えになってませんね。テストした事無いもので。。。

(3)これは、コマンドバッファリングと言うものだ。
簡単に言うと $| はデフォルトでは 0 で、0 以外の値を入れる事によって
print の後にすぐフラッシュする。
バッファリングしないのではない事に注意。
(私は、$|=1; これでバッファしないと思っていたが、今らくだ本を見たら違っていました。
らくだ本をもっていたら 改訂版の146ページを参照して下さい。)
ブロックバッファリングされるのです。

グラフィックを扱うスクリプトなどでは、
$| = 1;
これを皆さん使っています。

バッファとは、cpu と他の機器との処理速度の差を埋める為に
一時的にデータを蓄積するものです。





質問者 ひこ  [削除]  投稿日 2/13(火) 14:40:13
皆さんイロイロな回答ありがとうございました。

(1)に関しましては、しあわせのツボ様の言われているとうり、ヒアドキュメントを使用して変数のない部分は“'”を使用するように変更しました。

(2)に関しましては、皆様処理速度には変わりがないと言われているので、処理の一貫性を保たせる為にGetを使用しようと思います。
(データを表示させる時はGet、データを更新する時はPostのように、処理方法は混在させない方がいいんですよね?)

(3)に関しましては、皆様の回答を拝見する限り$|=1;を記述すれば少しでも処理が速くなるように感じられるのですが、
ただ、サーバーの重たい時間は皆同じ。
$|=1;を書く事で、サーバーに余計な負荷をかけてしまったりはしないのでしょうか?
(本音を言えば、他の人はどうでも良くって、自分だけでも処理スピードがあがればいいのですが…(苦笑))
とりあえず、今のところは$|=1;の記述を入れてありますが、もしそういう事であれば、$|=1;の記述は外したいと思います。
回答者 さくら  [削除]  投稿日 2/14(水) 03:04:45
>(データを表示させる時はGet、データを更新する時はPostのように、処理方法は混在させない方がいいんですよね?)

もう一度ご説明しますが、GET と POST はリクエストメソッドです。
これを、同時に使う事はできません。
CGIスクリプトを呼び出す場合、<A HREF="url"> <IMG SRC="url">
等も有りますが、ご質問のFORM の場合、例えば、
<FORM ACTION="http://domail/script.cgi?query" METHOD="POST">
この様に呼び出します。
この場合、リクエストメソッドはPOSTです。
入力されたデータはCGIスクリプトに渡されます。ですから、CGIスクリプトでは、
標準入力からデータを読みこむことができます。STDIN からですね。
この時、?の後のqueryはどうなるのかと言うと、
? はクエリーシンボルと言って、WEBサーバーはこれを見つけると、
この後のデータを環境変数にセットします。
環境変数は perl が持っている訳でなく、システムが持っているものです。
UNIXならUNIX環境変数です。perl では、%ENV でアクセスできます。
$ENV{'QUERY_STRING'} でquery を取得できます。
では、METHOD="GET" だったらと言うと、query は送られません、
入力データにオーバーライトされてしまいます。

HREF や IMG を使った場合は、貴方の使っているクライアント(ブラウザ)が、
GETリクエストを送信しています。
私の考えでは、POSTメソッドを使用して、クエリーデータを同時に渡しても、
問題は無いと思います。
リクエストヘッダーには、他にも、ホストやユーザーエージェントやリンク元等の
さまざまなデータが渡されます。それらは、やはり環境変数にセットされます。
クエリーもその一つなのです。

仕組みが少し分かっていただけたでしょうか?

結果、どちらを使うかは貴方が決める事ですが、
私の意見はFORMではPOSTを使うほうが良いと考えています。
理由は2つあります。
一つは貴方も知っていると思いますが、送信データの量に制限がないという事。
もう一つは、POSTの場合は情報を送信する為のメソッドである為、
ほとんどの、WEBクライアントは、重複送信に対して、警告メッセージを出すように
設計されています。
オーダーFORMを扱うスクリプト等では、ユーザーに対しても、WEB管理者に対しても親切な設計であると言えるでしょう。

(3)
$| = 1;
これを使うと若干性能が低下するようです。
書きこむたびにフラッシュするのは、効率低下の原因になるようです。
ただ、グラフィックを扱う場合には、イメージデータの損失や破壊を防ぐ効果があるようです。
グラフィックを扱っているので無ければ、やめたほうが良いかもしれませんね。

返信(回答)する


Web裏技