井上

C++ vs. Java vs. C#のネットワークパフォーマンス比較

Comparing Two High-Performance I/O Design Patterns
http://www.artima.com/articles/io_design_patterns.html
を読んでみました。

ここで比較しているReactorパターンとProactorパターンを、それぞれPOSIX風に言い換えると次のようになります。

Reactorパターン
select(2) or poll(2)でソケットの監視をして、non-blockingなrecv(2)、send(2)で送受信します。
ソケットが読み書きできるようになるまでカーネルで待機して、読み書きできるようになるとユーザアプリに制御が来ます。ユーザアプリはrecvで読み込んだデータをバッファにコピー(読み込み時)するか、バッファにデータを書き込んでsendを呼びます。実際のネットワーク上へのデータ送受信は、カーネルの仕事です。

Proactorパターン
非同期IOのAPI(aio_のprefixの付いたAPI)で送受信します。
ネットワークの送受信が完了した時点で、カーネルからユーザアプリに制御が来ます。読み込みの場合、バッファに読み込みデータが既に入っているので、ユーザアプリはそれを使えます。


後者の方が効率的という話は新しい話題ではなく、POSIXのリアルタイム拡張(10年以上前)の頃からの話です。もっとも、10年以上経っても前者が優勢である現実はaioにも問題があるゆえだと思っていますが(率直に言って、あまり使いやすくありません)。

上記の記事自体は、OSごとに両方のパターンを混ぜて使うのは大変なので、select/pollでProactorをエミュレートするテクニックの紹介です。やっていることは、Proactor jobと呼ばれるユーザアプリのイベントハンドラが読み書きを完結させて、改めてReactorパターンに従うイベントハンドラを叩く、というだけです。

興味深いのは、C++、Java、C#のパフォーマンス比較です(3ページ目のグラフ)。C#がJavaに負けてます。Javaは自分の手元で使うと遅いのに、公開されたベンチマークだと良い結果を目にすることが多いです。本当はできる子なのに、ぼくの前では手を抜いているのか、と厭味を言いたくなります。


posted at 015751腱 on 2005綛1129 by inoue - Category: General

TrackBack

DISALLOWED (TrackBack)

Comments

No comments yet

Add Comments

このアイテムは閉鎖されました。このアイテムへのコメントの追加、投票はできません。