【问题标题】:GLib's GAsyncQueue vs. POSIX message_queueGLib 的 GAsyncQueue 与 POSIX message_queue
【发布时间】:2012-03-02 21:43:32
【问题描述】:

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

我发现使用 GLib 更好地实现可移植性,但 POSIX mq 的优势在于能够选择或轮询它们。

但是,我没有找到任何关于谁的性能更好的信息。

【问题讨论】:

    标签: performance posix ipc message-queue glib


    【解决方案1】:

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

    • 创建两个线程(pthreads / gthreads)。
    • 一个线程生成数据并分块写入 IPC,直到发送 1024 MB 数据。
    • 另一个线程使用来自 IPC 的数据。 我测试了 4、64、256、512 和 1024 字节的块大小。 我使用 GAsyncQueue(使用 gthread)、POSIX 消息队列和 UNIX 域套接字(使用 pthread)进行了测试。

    得到的结果如下:

    总而言之,perf(GAsyncQueue) > perf(mq) > perf(UNIX socket),尽管 GAsyncQueue 和 POSIX 消息队列的性能在大多数情况下是相当的 - 差异仅出现在较小的消息大小。

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

    【讨论】:

    • 非常有趣。我已经对你的回答和问题投了赞成票,也许现在它可以让你发布图表了。
    • 我又进行了一些实验:在线程之间添加信号,让消费者知道数据已经生成。我使用了 eventfd Linux 技术。一旦我这样做了,我就看到 GAsyncQueue 的性能下降到与其他类似。
    • 这是否解释了结果?所有 linux IPC 机制都经过内核,因此具有相似的性能。 GAsyncQueue 以某种方式实现了用户空间 - 额外的用户空间 - 避免了内核空间复制,从而提高了性能。一旦添加了 eventfd 机制,内核就会再次出现。这种理解正确吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 2011-05-11
    • 2011-06-02
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    相关资源
    最近更新 更多