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,在维基百科的笔记的帮助下,这是一个巨大的成功.
| 归档时间: |
|
| 查看次数: |
10468 次 |
| 最近记录: |