GLib的GAsyncQueue与POSIX message_queue

dbi*_*ash 12 performance posix ipc glib message-queue

有没有人知道GLib的GAsyncQueue与POSIX message_queue相对于线程间通信的相对性能?我将有许多小消息(单向和请求 - 响应类型),在Linux上用C实现(现在;可能稍后移植到Windows).我正在尝试决定使用哪一个.

我发现使用GLib更便于携带,但POSIX mq具有能够选择或轮询它们的优点.

但是,我没有找到有关其性能更好的任何信息.

dbi*_*ash 15

由于我的问题没有回复,我决定自己进行一些性能测试.主要想法来自http://cybertiggyr.com/throughput/throughput.html.测试的想法是:

  • 创建两个线程(pthreads/gthreads).
  • 一个线程产生数据并以块的形式写入IPC,直到发送1024 MB数据.
  • 另一个线程消耗了IPC的数据.我测试了块大小为4,64,256,512和1024字节.我使用GAsyncQueue(使用gthreads),POSIX消息队列和UNIX域套接字(使用pthreads)进行了测试.

以下是获得的结果:

在此输入图像描述

总而言之,perf(GAsyncQueue)> perf(mq)> perf(UNIX套接字),尽管GAsyncQueue和POSIX消息队列的性能在大多数情况下是可比较的 - 但只有小消息大小才会出现差异.

我想知道如何实现GAsyncQueue以提供比Linux的本机消息队列实现更好的性能.遗憾的是它不能像其他两个一样用于进程间通信.

  • 这对结果有解释吗?所有 Linux IPC 机制都通过内核,因此具有相似的性能。GAsyncQueue 以某种方式具有用户空间实现 - 避免了额外的用户空间 - 内核空间复制,这会带来更好的性能。一旦添加了 eventfd 机制,内核就会再次出现。这种理解正确吗? (2认同)