进程间消息队列性能-相当慢? 我需要一个超快速的MQ机制,发送者和接收者都是在Windows平台上用C++编写的。
我目前使用的IPC实现在Windows命名管道上的时钟频率约为20000 msg/sec 我正在根据测试boost::进程间消息队列的性能,并测量大约48000条消息/秒,这是惊人的慢,考虑到当我在同一台机器上创建一个简单的内存映射文件通信(在C#using中)时,我得到了大约150000条消息/秒 您知道为什么boost消息队列的性能如此之慢吗?我可以尝试改进它吗?作为boost文档,boost::进程间::共享内存对象是在Win32中使用内存映射文件实现的。boost的消息队列也在使用模拟的共享内存对象。(对于本机Win32共享内存,boost单独提供windows_共享_内存类。) 因此,为了提高消息队列的性能,您必须使用本机Win32共享内存对象实现自己版本的消息队列。在我的实验中,更换后,性能显著提高进程间消息队列性能-相当慢? 我需要一个超快速的MQ机制,发送者和接收者都是在Windows平台上用C++编写的。,c++,performance,ipc,memory-mapped-files,boost-interprocess,C++,Performance,Ipc,Memory Mapped Files,Boost Interprocess,我目前使用的IPC实现在Windows命名管道上的时钟频率约为20000 msg/sec 我正在根据测试boost::进程间消息队列的性能,并测量大约48000条消息/秒,这是惊人的慢,考虑到当我在同一台机器上创建一个简单的内存映射文件通信(在C#using中)时,我得到了大约150000条消息/秒 您知道为什么boost消息队列的性能如此之慢吗?我可以尝试改进它吗?作为boost文档,boost::进程间::共享内存对象是在Win32中使用内存映射文件实现的。boost的消息队列也在使用模拟的
请注意,如果更改为Win32本机共享内存,则必须注意“删除”共享内存。POSIX共享内存和Win32共享内存具有不同的删除策略。Daniel的答案是其中的一部分,但这里有一个更大的问题:boost::interprocess基本上将队列作为一个数组维护在共享内存中,并且在发送消息时,boost::interprocess:message_队列根据新消息的优先级进行二进制搜索,以找到消息应该放在数组中的位置,然后
std::backward_copy
s复制所有其他消息以腾出空间。如果始终使用相同的优先级,则消息将放在开头(因为它是最新的),因此此时缓冲区中的任何消息都将被向后复制以腾出空间,这需要时间。(请参见队列\u free\u msg
方法的实现)
如果您不需要消息具有优先级,只需要一个常规的FIFO队列,那么这种方法比使用a慢得多:插入(发送)的性能会随着队列大小的增长而迅速恶化
更新:在的帮助下,我编写了一个在内部使用循环缓冲区的消息队列版本,这是一个巨大的成功。谢谢!Doh。我现在注意到,在我的测试过程中,确实在文件系统中创建了一个文件,用于“模拟”共享内存。有没有机会共享你的实现,或者直接在Windows本地共享内存中知道一个不同的C++ MQ/RPC框架?我发现很难相信在某个地方没有现成的解决方案?我尝试按照您的建议将boost message_queue更改为使用windows_shared_memory,并在google上对message_queue.hpp进行了以下编辑:(1)替换细节::managed_open_或_create_impl