金利0無利息キャッシング – キャッシングできます

 | 

2010-05-31

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

01:08 | LLごとの標準的なHTTPクライアントで100リクエスト投げた時のベンチマーク - 金利0無利息キャッシング – キャッシングできます を含むブックマーク はてなブックマーク - LLごとの標準的なHTTPクライアントで100リクエスト投げた時のベンチマーク - 金利0無利息キャッシング – キャッシングできます

取得対象はlocalhostのfaivcon画像、サーバーはnginxで十分速い。3638bytes。

$ time ruby ruby.rb
real    0m0.512s
user    0m0.247s
sys     0m0.123s

$ time python python.py
real    0m0.908s
user    0m0.216s
sys     0m0.072s

$ time perl lwp.pl
real    0m0.591s
user    0m0.400s
sys     0m0.028s

$ time perl curl_easy.pl
real    0m0.087s
user    0m0.052s
sys     0m0.025s

考察

100リクエストで350KB程度転送するのにLL付属の標準的なHTTPクライアントだと500-1000msぐらいかかるようだ。curl使うと100ms以下で終わる。

ソース

perl以外はググって最初に出てきた方法で書いた。

ruby

require 'net/http'

def http_get
  Net::HTTP.version_1_2
  Net::HTTP.start('localhost', 80) {|http|
    response = http.get('/favicon.ico')
    # puts response.body
  }
end

n = 100
for i in 1..n; http_get; end

python

import urllib

for i in xrange(100):
    f = urllib.urlopen("http://localhost/favicon.ico")
    f.read()

perl lwp使用

use LWP::Simple qw(get);
get "http://localhost/favicon.ico" for 1..100;

perl curl使用

use WWW::Curl::Easy;
my $url = 'http://localhost/favicon.ico';
my $num = 100;
curl_easy();

sub curl_easy {
    my $curl = new WWW::Curl::Easy;
    for ( 1 .. $num ) {
        my $response_body;
        my $header;
        $curl->setopt( CURLOPT_URL, $url );
        open( my $fileb, ">", \$response_body );
        $curl->setopt( CURLOPT_WRITEDATA, $fileb );
        open( my $fileh, ">", \$header );
        $curl->setopt( CURLOPT_WRITEHEADER, $fileh );

        my $retcode = $curl->perform;
        if ( $retcode == 0 ) {
            my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
        }
    }
}

追試、追記

tokuhiromがLL + 低レイヤーバージョンを書いてくれたので同一環境で追試。

http://d.hatena.ne.jp/tokuhirom/20100601/1275352858

ちなみに試験に使ってる画像はこれです http://reader.livedoor.com/favicon.ico ローカルに保存してから使ってね。

$ time perl net_http.pl
real    0m0.422s
user    0m0.139s
sys     0m0.019s

$ time python httplib.py
real    0m0.752s
user    0m0.217s
sys     0m0.059s

大体の速度の規模感を把握するためのベンチなので、そんなに正確さを重視してません。処理系の起動にかかった時間やライブラリの読み込みにかかった時間も含んでいますが、無視出来るほど小さいので書いてない(リクエスト投げないコードとの差を取れば実際の処理にかかった時間が分かる)

realは実際にかかった時間でサーバーからの応答待ちの時間も含みます。

$ time perl -e "sleep 1"
real    0m1.006s
user    0m0.001s
sys     0m0.002s

複数プロセス走らせてサーバーからの応答待ちによる無駄な時間を無くした場合のパフォーマンスはuser+sysの合計値が少ないほど優秀ということになります。

perlerperler2010/06/01 03:31標準外だけどperlでAnyEvent::HTTPにれ$AnyEvent::HTTP::MAX_PER_HOSTを
4から100に変更した版の計測追加もキボヌ

malamala2010/06/01 12:25それはすでに比較したことがあるから書いてない。LWPより気持ち早い程度。
http://wiki.github.com/mala/AnyEvent-Curl/

AnyEvent::HTTPはそんなに速くないからAnyEvent::Curlを書いている。
細かいこと検証したいなら自分でやれ、人に頼るな、クソが。

$AnyEvent::HTTP::MAX_PER_HOSTを増やす場合、並列して投げるリクエストが増える分、(遅いサーバーにアクセスする場合は特に)処理時間が短くなるが、同一サーバーに対するコネクションを使いまわさなくなるため、CPU時間的には遅くなる。それはこの記事の主旨じゃない。

hzrqwxxkxbthzrqwxxkxbt2011/03/22 19:27xReneG <a href="http://tyzkspetftoc.com/">tyzkspetftoc</a>, [url=http://kvazfghzajxq.com/]kvazfghzajxq[/url], [link=http://djshxykvkrzl.com/]djshxykvkrzl[/link], http://yzzuhrkozsbm.com/

 |