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

Ome*_*viv 12 c++ performance ipc memory-mapped-files boost-interprocess

我需要一个超快速的MQ机制,其中发送器和接收器都是用C++编写的,在Windows平台上.

我目前使用RCF-C++进行IPC的实现在Windows命名管道上的时钟频率约为20,000 msg /秒.

我正在根据演示应用程序测试boost :: interprocess消息队列的性能,并且测量大约48,000条消息/秒,这是非常慢的,考虑到当我在同一台机器上编写一个简单的内存映射文件通信时(在C#使用此博客文章中的代码),我得到了大约150,000条消息/秒.

任何想法为什么我从提升message_queue获得如此缓慢的性能,以及我可以尝试改进它?

Ome*_*viv 13

Daniel的答案是其中的一部分,但是这里存在一个更大的问题:boost :: interprocess基本上将队列维护为共享内存中的数组,并且在发送消息时,boost :: interprocess:message_queue基于以下内容进行二进制搜索:新消息的优先级是找到消息应该放在数组中的位置,然后std::backward_copy是所有其他消息以便为它腾出空间.如果你总是使用相同的优先级,你的消息将放在开头(因为它是最新的),所以当时你在缓冲区中的任何消息将被反向复制以为它腾出空间,这需要时间.(参见queue_free_msg方法的实施).

如果你不需要的邮件有重点,只想要一个普通的FIFO队列,那么这种方法比使用慢了许多循环缓冲:插入(发送)的性能迅速恶化的队列的大小增长.

更新:我在内部使用循环缓冲区编写了一个版本的message_queue,在维基百科笔记的帮助下,这是一个巨大的成功.

  • 我知道这已经很老了,但是我正在检查在boost中使用message_queue,我发现它现在处于提升状态(从1.52开始:https://www.boost.org/users/history/version_1_52_0.html,请参阅BOOST_INTERPROCESS_MSG_QUEUE_CIRCULAR_INDEX) (4认同)
  • Omer,您可以将使用循环缓冲区的message_queue版本发送到Boost本身.他们可能会接受它! (2认同)

Dan*_* K. 8

正如Boost文档所述,boost :: interprocess :: shared_memory_object是使用Win32中的内存映射文件实现的.而且,boost的消息队列也在使用该模拟的共享内存对象.(对于本机Win32共享内存,boost分别提供了windows_shared_memory类.)

因此,为了获得更好的消息队列性能,您必须使用本机Win32共享内存对象实现自己的消息队列版本.在我的实验中,在更换之后,性能显着提高.

请注意,如果更改为Win32本机共享内存,则必须注意"删除"共享内存.POSIX共享内存和Win32共享内存有不同的删除策略.