Re: LLごとの標準的なHTTPクライアントで100リクエスト投げた時のベンチマーク
http://subtech.g.hatena.ne.jp/mala/20100531/1275322139
mala のベンチマークにおいて、気になる点がある。それは、「HTTP プロトコルにたいするベタなライブラリ」と「HTTP プロトコルをつかうための高レベルなライブラリ」のベンチマークがまじっているという点。
前者は
- ruby/Net::HTTP
- python/httplib
- perl/Net::HTTP
にあたるものであり
後者は
- ruby/open-uri
- python/urllib(urllib2)
- perl/LWP::Simple
にあたるものである。
で、ruby/Net::HTTP と perl/LWP::Simple をならべて、LWP が遅いといわれてもなんだろうから、かけている部分のベンチマークスクリプトをおいておく。
しかし、それにしても curl はやいね。
Python
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)
Perl/Net::HTTP
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 でも意外といける。