http://subtech.g.hatena.ne.jp/mala/20100531/1275322139
mala のベンチマークにおいて、気になる点がある。それは、「HTTP プロトコルにたいするベタなライブラリ」と「HTTP プロトコルをつかうための高レベルなライブラリ」のベンチマークがまじっているという点。
前者は
にあたるものであり
後者は
にあたるものである。
で、ruby/Net::HTTP と perl/LWP::Simple をならべて、LWP が遅いといわれてもなんだろうから、かけている部分のベンチマークスクリプトをおいておく。
しかし、それにしても curl はやいね。
urllib は httplib のラッパーとして動作している。httplib は、ごく低レベルな http protocol client library である。
import httplib
for i in xrange(100):
h = httplib.HTTPConnection('localhost', 80)
h.request("GET", "/favicon.ico")
r = h.getresponse()
# print r.status
c = r.read()
# print len(c)
Net::HTTP は perl における低レベルな http client library である。entity body のよみこみ部分が妙に低レベルだが。
use strict;
use Net::HTTP;
for my $i (1..100) {
my $body;
my $nh = Net::HTTP->new(Host => 'localhost');
$nh->write_request('GET', '/favicon.ico') or die;
my ($code, $mess, %headers) = $nh->read_response_headers();
while (1) {
my $ret = $nh->read_entity_body(my $buf, 1024*1024);
if ($ret == 0) {
last; # EOF
} elsif ($ret == -1) {
; # if no data could be returned this time
} elsif (!defined $ret) {
die "err: $!";
} else {
$body .= $buf;
}
}
# printf "$code, $mess, %d\n",length($body);
}
さてここで、ベンチマークの結果についてのべる。
tokuhirom@gpath:~/tmp/20100601$ time perl curl.pl
real 0m0.096s
user 0m0.040s
sys 0m0.010s
tokuhirom@gpath:~/tmp/20100601$ time perl lwp.pl
real 0m0.356s
user 0m0.320s
sys 0m0.030s
tokuhirom@gpath:~/tmp/20100601$ time perl net-http.pl
real 0m0.112s
user 0m0.080s
sys 0m0.030s
curl は速いが、同程度に低レベルなインターフェイスをもつ Net::HTTP でも意外といける。