2012-02-10 101 views
11

有沒有人對GLib的GAsyncQueue與POSIX message_queue的線程間通信的相對性能有任何想法?我將會有許多小的消息(單向和請求響應類型),用C語言在Linux之上實現(現在可能;稍後可能會移植到Windows)。我正在嘗試決定使用哪一個。GLib的GAsyncQueue與POSIX message_queue

我發現使用GLib更適合可移植性的目的,但POSIX mq的優勢是可以選擇或輪詢它們。

但是,我還沒有找到有關哪些性能更​​好的信息。

回答

14

由於沒有回覆我的問題,我決定自己運行一些性能測試。主要想法取自http://cybertiggyr.com/throughput/throughput.html。測試想法是:

  • 創建兩個線程(pthreads/gthreads)。
  • 一個線程產生數據並以大塊的形式寫入IPC,直到發送1024 MB數據。
  • 其他線程使用來自IPC的數據。 我測試了塊大小爲4,64,256,512和1024字節。 我使用GAsyncQueue(帶有gthreads),POSIX消息隊列和UNIX域套接字(帶有pthreads)進行了測試。

下面是所獲得的結果:

enter image description here

總之,香水(GAsyncQueue)> PERF(MQ)> PERF(UNIX插座),儘管GAsyncQueue和POSIX消息隊列的性能是在大多數情況下相當 - 只有小消息大小纔會出現差異。

我想知道如何實現GAsyncQueue以提供比Linux本地消息隊列實現更好的性能。可惜它不能用於進程間通信,就像另外兩個可以。

+1

非常有趣。我已經提出了你的回答和問題,現在可能會讓你發佈圖表。 – kalev 2012-02-16 22:31:59

+0

我跑了一些更多的實驗:在線程之間增加信號讓消費者知道數據已經產生。我使用了eventfd Linux技術。而且一旦我這麼做了,我看到GAsyncQueue的性能降低到與其他類似。 – dbikash 2012-02-21 06:21:14

+1

這是否給出瞭解釋結果?所有的Linux IPC機制都通過內核,因此具有相似的性能。 GAsyncQueue以某種方式具有用戶空間實現 - 額外的用戶空間 - 避免了內核空間複製,從而獲得更好的性能。並且一旦添加eventfd機制,內核就會再次進入畫面。這種理解是否正確? – dbikash 2012-02-21 06:23:39