进程间消息队列性能-相当慢? 我需要一个超快速的MQ机制,发送者和接收者都是在Windows平台上用C++编写的。

进程间消息队列性能-相当慢? 我需要一个超快速的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的消息队列也在使用模拟的

我目前使用的IPC实现在Windows命名管道上的时钟频率约为20000 msg/sec

我正在根据测试boost::进程间消息队列的性能,并测量大约48000条消息/秒,这是惊人的慢,考虑到当我在同一台机器上创建一个简单的内存映射文件通信(在C#using中)时,我得到了大约150000条消息/秒

您知道为什么boost消息队列的性能如此之慢吗?我可以尝试改进它吗?

作为boost文档,boost::进程间::共享内存对象是在Win32中使用内存映射文件实现的。boost的消息队列也在使用模拟的共享内存对象。(对于本机Win32共享内存,boost单独提供windows_共享_内存类。)

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


请注意,如果更改为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_implm_shmem;详细信息::管理的\u打开的\u或\u创建的\u impl m\u shmem;(2) 将标题更改为包含“windows_shared_memory.hpp”而不是“shared_memory_object.hpp”(3)注释掉消息_queue::remove以仅返回true;现在我看不到它在文件系统上创建文件,但性能完全相同。有什么想法吗?我想你的实现和我的差不多。但是性能可能取决于许多因素,例如消息的长度。在我的测试中,当使用Win32共享内存时,打开消息队列的速度要快得多。两者最终都使用内存映射文件,但windows_共享_内存使用系统分页文件存储的文件,而不是共享_内存对象使用的临时常规文件。这可以让windows_共享_内存跳过在磁盘上实际创建文件的过程(我想除非操作系统将内存分页),如果您发送非常大的消息,这将是一个巨大的问题;否则,仅在磁盘上分配文件可能需要几秒钟/分钟,即使后续的读/写速度与windows_共享_内存一样快。7年前,boost中甚至有一个开放的票证,将对windows_共享_内存的支持添加到消息队列中,但它似乎从未得到重视:Omer,您可以发送您的消息队列版本,该队列使用循环缓冲区提升自身。他们可能会接受@Pietro懒得这么做,但是你可以看到代码需要清理-所有关于消息优先级的提到都应该删除,新的实现完全忽略了它。我知道这很旧,但我正在检查在boost中使用消息队列,我发现它现在在boost中(自1.52:,请参阅BOOST\u进程间\u消息\u队列\u循环\u索引)