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を出力します。だから、このぶん遅くなると思ってました。

[上に] [前に] [次に]