tokuhirom's Blog

Re: LLごとの標準的なHTTPクライアントで100リクエスト投げた時のベンチマーク

http://subtech.g.hatena.ne.jp/mala/20100531/1275322139
mala のベンチマークにおいて、気になる点がある。それは、「HTTP プロトコルにたいするベタなライブラリ」と「HTTP プロトコルをつかうための高レベルなライブラリ」のベンチマークがまじっているという点。

前者は

にあたるものであり

後者は

にあたるものである。

で、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 でも意外といける。