我需要一个超快的 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/