NPHスクリプトがあまり使われないのはどうして?
[上に]
[前に]
[次に]
える
1999/12/16(木) 11:43:48
CGIで使うNPHスクリプトは処理が早くなると単純に思っているのですが、ちまたではあまり使われていないようです。
何かデメリットがあるからなのでしょうか?
サポートしているサーバが少ないとすれば、ではなぜサーバ側はサポートしてくれないのでしょうか?
きたむら
1999/12/17(金) 18:24:43
私の場合、とほほさんのCGI入門で、初めてnon-parsed headerなCGIの存在を知りました。
やはりみんなNPHスクリプトのこと知らないんでは?(←自分が基準なやつ)
B-Cus
1999/12/17(金) 19:17:28
> NPHスクリプトは処理が早くなると単純に思っているのですが
実際にどれだけ早くなるんでしょうか。誰か教えて下さい。
ふじ
1999/12/17(金) 22:03:18
#!/usr/local/bin/perl
print "HTTP/1.0 200 OK\n";
print "Content-Type: text/plain\n\n";
open IN, "< $ARGV[0]";
while(<IN>){
print;
}
こんな NPH スクリプトと、2行目をのぞいた CGI を作って
ベンチマーク取ってみましたけど、特に速度に違いがあるという結果は出ませんでした。
例えば、
Benchmark: timing 800 iterations of CGI, NPH...
CGI: 15 wallclock secs ( 2.05 usr + 0.73 sys = 2.78 CPU)
NPH: 15 wallclock secs ( 2.05 usr + 0.67 sys = 2.72 CPU)
こんな感じ。
#この場合、CPU 時間は CGI のものじゃなくて、ベンチマークスクリプト自身のものですので、
#重要なのは経過時間の方だと思う。
転送するファイルの大きさに依存するか?と思って、いろんなサイズで
やってみましたけど、有意な差は認められませんでした。
うーん。スクリプトが単純なのが原因?
ベンチマークスクリプトは以下。
#!/usr/local/bin/perl
use Benchmark;
use LWP::Simple;
$datafile = $ARGV[0];
$count = $ARGV[1];
@t = timethese($count , {
'CGI' => '&cgi;',
'NPH' => '&nph;',
});
sub cgi{
get("http://localhost/cgi-bin/dl.cgi?$datafile")
}
sub nph{
get("http://localhost/cgi-bin/nph-dl.cgi?$datafile")
}
B-Cus
1999/12/18(土) 07:48:44
あ、今ごろになって思い出した。
# わざわざ調べてもらったのに すんません>ふじさん
http://japache.infoscience.co.jp/apache/docs/misc/FAQ.html#nph-scripts
なので、apache-1.3 では nph を使う意味がありません。
B-Cus
1999/12/18(土) 07:57:19
追加。
やはりバッファリングにはそれなりの意味があるわけで
(遅くなるなら最初からバッファリングなんてしない)、
・エンドユーザへのレスポンスが遅くなるというt
・メモリと CPU に負荷をかける
というデメリットはありますが、その分ネットワーク
転送効率を上げる効果があります。
なので、apache-1.2 であっても、速度をはからずに
nph の方が優れているという結論付けるのはどうかと。
# メモリと CPU に負荷をかけてる…ってのも怪しいかも。
# 結局 パケット送信の処理が減るかもしれないので、
# やはり測ってみないことにはなんとも言えないなぁ。
える
1999/12/21(火) 11:48:18
ということは、NPHスクリプトはバッファリングに関わるだけで、つまり、
$|=1;
と変わらないのでしょうか?
NPHだと、実行結果を解釈せずにそのまま吐き出すので、処理が早くなりそうな気がするのですが。
ふじ
1999/12/21(火) 14:46:45
> ということは、NPHスクリプトはバッファリングに関わるだけで
B-Cus さんの示されたリンクを読みましたか?
少なくとも Apache 1.3 ではサーバはバッファリングをしないそうなので、
> Today, the only difference between nph scripts and normal scripts
> is that nph scripts require the full HTTP headers to be sent.
「今日では、nphスクリプトと普通のスクリプトの違いは、nph が完全な
HTTP ヘッダを送信することを求められるということだけです。」
$|=1; は Perl が内部でバッファリングを行うかどうか、ということです。
前述のベンチマークスクリプトで、$|=1; ありとなしのスクリプトを比べると、
送信するファイルの大きさが 1KB では差はないですが、
20KB の時には 1割強、900KBの時には約10倍(!)の速度差が出ました。
# $|=1 ありのほうが遅い。
実験に使ったファイルが、1行50byte 程度 * 18000行、というものだった
(頻繁にバッファのフラッシュが起きる)せいもありますし、
CGI で 1MB も送信することはそう無いだろうから、実験の妥当性は
少々疑問ですが(^^;
> やはりバッファリングにはそれなりの意味があるわけで
確かに。
える
1999/12/21(火) 18:30:17
[[解決]]
>B-Cus さんの示されたリンクを読みましたか?
ごめんなさい。外国語だったので、読み飛ばしてしまいました。
>「今日では、nphスクリプトと普通のスクリプトの違いは、nph が完>全なHTTP ヘッダを送信することを求められるということだけで
>す。」
これで納得しました。どうもありがとうございました。
>NPHだと、実行結果を解釈せずにそのまま吐き出すので、処理が早くなりそうな気がするのですが。
自己レスですが、
print "Location: $path\n\n";
などとすると、Apacheはちゃんと302を出力します。だから、このぶん遅くなると思ってました。
[上に]
[前に]
[次に]