2012-02-10 15 views
11

スレッド間通信のためにGLibのGAsyncQueueとPOSIXのmessage_queueの相対的なパフォーマンスを知っている人はいますか?私はLinux上でCで実装される多くの小さなメッセージ(一方向性と要求応答性の両方のタイプ)を持っています(今のところWindowsに移植されるかもしれません)。どちらを使うか決めようとしています。GLibのGAsyncQueueとPOSIXのmessage_queue

私が知ったところでは、GLibを使用する方が移植性が向上しますが、POSIX mqは、それらを選択またはポーリングできるという利点があります。

ただし、パフォーマンスが優れている情報は見つかりませんでした。

答えて

14

私の質問に対する回答がなかったので、私は自分でいくつかのパフォーマンステストを行うことにしました。主な考えはhttp://cybertiggyr.com/throughput/throughput.htmlから取られました。テストの考え方は次のとおりです。

  • 2つのスレッド(pthreads/gthreads)を作成します。
  • 1つのスレッドがデータを生成し、1024 MBのデータが送信されるまで、チャンクでIPCに書き込みました。
  • もう1つのスレッドは、IPCからのデータを消費しました。 4、64、256、512、1024バイトのチャンクサイズでテストしました。 GAsyncQueue(gthreads)、POSIXメッセージキュー、UNIXドメインソケット(pthreads)でテストしました。ここ

結果が得られる。

enter image description here

GAsyncQueueとPOSIXメッセージキューの性能があるけれども、PERF(GAsyncQueue)> PERF(MQ)> PERF(UNIXソケット)を要約しますほとんどの場合に匹敵します。その違いは小さなメッセージサイズでのみ発生します。

Linuxのネイティブメッセージキューの実装よりも優れたパフォーマンスを提供するために、GAsyncQueueがどのように実装されているのでしょうか。他の2つの方法のように、プロセス間通信に使用できないのは残念です。

+1

非常に興味深い。私はあなたの答えと質問をupvoted、おそらく今あなたがグラフを投稿できるようになります。 – kalev

+0

私はいくつかの実験を行いました:データが生成されたことを消費者に知らせるためにスレッド間にシグナリングを追加しました。私はeventfd Linuxテクニックを使用しました。そしてすぐに、私はGAsyncQueueのパフォーマンスが他と似ていることが分かりました。 – dbikash

+1

これは結果を説明しますか?すべてのLinux IPCメカニズムがカーネルを通過するため、同様のパフォーマンスが得られます。 GAsyncQueueは、何らかの理由でユーザー空間の実装(余分なユーザー空間)があり、カーネル領域のコピーが回避され、パフォーマンスが向上します。そして、eventfdメカニズムが追加されるとすぐに、カーネルが再び現れます。その理解は正しいのでしょうか? – dbikash

関連する問題