ライブラリ-libuvとlibevの比較

2976 ワード

From: http://blog.chinaunix.net/uid-28458801-id-4463981.html
libuv 和 libev ,二つの名前がかなり近いI/O Libraryですが、最近幸いにも二つのLibraryでいくつかのことを書いています.以下に説明します.
高性能ネットワークプログラミングという話題はもう議論されて腐っています.非同期.にかかわらず epoll それもいいです.クィエエです いずれにしても、非同期という話題は避けられない.libuvは非同期で、libevは同期の多重IO多重である.
libev システムI/O多重の簡単パッケージです.基本的には解決されました. epoll ,kqueuq を選択します プロジェクト API間の異なる問題.使用を保証する livev APIによって作成されたプログラムはほとんどの***nixプラットフォームで実行できます.しかし libev の欠点も明らかで、基本的にはEvent Libraryをカプセル化しただけなので、多くの不便があります.たとえば accept(3) 接続後は手動が必要です. set nonblocking.socketから読み書きする時は検査が必要です. イーガン 、EWOULD BLOCK 和 エイト .これも大多数の人が非同期プログラムが書きにくいと思っている根本的な原因です.
libuv もっと上の方に見える.libuv joyentがNodeに作ったセットI/O Libraryです.これも招いたのです libuv 最大の特徴はどこでも調子を変えることです.基本的に渋滞する可能性があるところがあります. すべてコールバック処理を使用します.このようにすると、実はプログラマーの仕事量が大幅に軽減されます.コールされた時、libuv あなたがすることを保証します.このように. イーガン 和 EWOULD BLOCK などのhandleはプログラマーの仕事ではありません.libuv 黙って解決してあげます.
libev socketで読み书き事件が発生したときは、「XX socketは読んで/书いてもいいです.自分で见てやってください」とだけ教えます.往々にして私たちは自分でメモリを申請して呼び出しが必要です. リード(3) または write(3) に応答します.
libuv ちょっと複雑です.二つの部分を分けて読みます.
インターフェースが読み取り可能な時、libuv あなたのallocate calbackを呼び出してメモリを申請し、読んだ内容を書き込みます.読み取りが完了すると、このsocketのために設定されたコールバック関数がlibuvに登録されます.パラメータにはこのブザーの情報が含まれています.あなたはこのブザーを処理するだけでfreeです. 落ちたらいいです.あなたのcalbackが呼び出された時にデータがreadyになりましたので、プログラマはブロックの問題を考えなくてもいいです.
書くことに対しての扱いはもっと巧妙です.libuv write calbackがありません.何かを書きたいなら、直接generate一つのwrite requestを書いてほしいbufferと一緒になくします. libuv ,libuv あなたのwrite requestに対応するsocketのwrite queueを入れます.I/Oで書くことができる時は順番に書きます.
Cはクローズドされていませんので、読み書きのコンテキストを確定します. libuv の使用者が直面する問題.そうでないと、プログラムが荒れ狂うバfferに直面しても、どれがどのデータなのか分かりません.この点の処理において、libuvは かかと libev 同じように一つを使っています. void*dataが問題を解決します.dataというmemberで何でも記憶できます.このようにブザーが来たら、必要なタイプに簡単にダタキャストを送るだけでいいです.
libev 非同期DNS解析がなく、この点はずっとスケーリング病として広く知られています.
libuv 非同期のDNS解析があり、解析結果もコールバック方式でプログラムに通知します.
libev 完全にシングルスレッドです.
libuv マルチスレッドライブラリのサポートが必要です.例えば、スレッドを内部で維持しています. getaddrifo(3) このような非同期の呼び出しができません.
libev 作者が一人で開発しているようです.バージョン管理はCVSですか?コミュニティ参加度は明らかに高くないです.
libuv コミュニティは非常に活発で、ほとんど毎日Issueを提出して、そしてコードに貢献する人がいます.
libev サポートしない IOCP ,Winで実行するプログラムが必要であれば大変です.
libuv サポート IOCP ,対応するスクリプトのコンパイルWinのライブラリがあります.
-----------------------------------------------
Q:ブロガーは両者のbenchmarkを作ったことがありますが、彼らの以前の性能はどうですか?
A:当時はlibevとlibuvで簡単なHTTP Hello World Serverを書きました.具体的な結果ははっきり覚えていませんが、性能の差は5%以内と言えます.
Q:  libuvはunix上でlibevをnon-blocking IOとして実現したのでしょうか?libuvの中で線の程池の中でスレッドの数量は増加することができて、上限がありますか?上限が来たらblockの状況がありますか?
A:1.libuvは5ヶ月ぐらい前にもうlibevを全く使わなくなりました.comit 665 a 316 a 9 d 551 ffdd 00 d 192 d 0 c 3 d 8 c 88 d 7 e 866を参照してください. ; 2.libuvのスレッド池はBSS上にあり、数は4つに固定されています.https://github.com/joyent/libuv/blob/master/src/unix/threadpool.c#L28 ; 3.libuvのスレッド池でwork queueを共有しているので、blockの場合は発生しません.
libevent :     ,     ,           ;
libev :  libevent  ,     ,    ,  Windows     ;
libuv :   node               ,     libev,     Windows,        ,*nix  libev  ,Windows  IOCP  ;
libuvソースgitダウンロード