c++ - boost::interprocess message_queue 性能 - 相当慢?

标签 c++ performance ipc memory-mapped-files boost-interprocess

我需要一个超快的 MQ 机制,发送方和接收方都用 C++ 编写,在 Windows 平台上。

我当前使用 RCF-C++ 的实现因为 IPC 在 Windows 命名管道上的时钟速度约为 20,000 msg/sec。

我正在根据 the demo app 测试 boost::interprocess Message Queues 的性能。 ,并且测量到大约 48,000 条消息/秒,考虑到当我在同一台机器上(在 C# 中使用 code from this blog post )编写一个简单的内存映射文件通信时,我每秒收到大约 150,000 条消息,这非常慢。

知道为什么我从 boost message_queue 中得到如此缓慢的性能,以及我可以尝试改进它吗?

最佳答案

Daniel 的回答是其中的一部分,但这里有一个更大的问题:boost::interprocess 基本上将队列维护为共享内存中的一个数组,并且在发送消息时,boost::interprocess:message_queue 会进行二进制搜索根据新消息的优先级来查找消息应该放在数组中的哪个位置,然后 std::backward_copy 为所有其他消息腾出空间。如果您始终使用相同的优先级,则您的消息将被放置在开头(因为它是最新的),因此您当时在缓冲区中的任何消息都将被向后复制以腾出空间,这需要时间。 (参见 queue_free_msg 方法的实现)。

如果您不需要消息有优先级,而只需要一个常规的 FIFO 队列,那么这种方法比使用 Circular Buffer 慢很多。 :插入(发送)的性能随着队列大小的增长而迅速恶化。

更新:notes on wikipedia 的帮助下,我编写了一个在内部使用循环缓冲区的 message_queue 版本。 ,这是一个巨大的成功。

关于c++ - boost::interprocess message_queue 性能 - 相当慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6212138/

相关文章:

javascript - 函数完成后如何删除滚动事件

javascript - 如何在jquery的drop方法中调用函数?

c++ - 如果我将 int 设置为等于 2 个最大 int 的总和会怎样?

c++ - 使用 C++ 在 Windows 中进行硬件加速图像缩放

c++ - 如何使用来自另一个 XMM 寄存器条目的 4 个相同 float 填充 x86 XMM 寄存器?

performance - 减缓网站爬虫

c - 同步访问两个进程之间共享内存中的数据

c++ - 如何连接两个应用程序

c - mq_timedreceive 报告 EAGAIN 错误且未设置 O_NONBLOCK

c++ - 动态链接库的问题