繁体   English   中英

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

[英]boost::interprocess message_queue performance - rather slow?

我需要一个超快的 MQ 机制,发送方和接收方都用 Windows 平台上的 C++ 编写。

我当前使用RCF-C++进行 IPC 的实现在 Windows 命名管道上的时钟速度约为 20,000 msg/sec。

我正在根据演示应用程序测试 boost::interprocess Message Queues 的性能,并且测量到大约 48,000 条消息/秒,考虑到当我在同一台机器上制作一个简单的 Memory 映射文件通信时(在C# 使用此博客文章中的代码),我每秒收到大约 150,000 条消息。

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

丹尼尔的回答是其中的一部分,但这里有一个更大的问题: boost::interprocess 基本上将队列维护为共享 memory 中的数组,并且在发送消息时, boost::interprocess:message_queue 基于新消息的优先级来查找消息应该放在数组中的哪个位置,然后std::backward_copy为所有其他消息腾出空间。 如果您始终使用相同的优先级,则您的消息将被放置在开头(因为它是最新的),因此您当时在缓冲区中的任何消息都将被向后复制以腾出空间,这需要时间。 (参见queue_free_msg方法的实现)。

如果您不需要消息具有优先级,而只需要一个常规的 FIFO 队列,那么这种方法比使用循环缓冲区要慢得多:插入(发送)的性能会随着队列大小的增长而迅速恶化。

更新:在 wikipedia 上的注释的帮助下,我编写了一个在内部使用循环缓冲区的 message_queue 版本,这是一个巨大的成功。

正如 Boost 文档所述,boost::interprocess::shared_memory_object 是使用 Win32 中的memory映射文件实现的。 而且,boost 的消息队列也在使用模拟的共享 memory object。 (对于原生 Win32 共享 memory,boost 单独提供 windows_shared_memory class。)

因此,为了获得更好的消息队列性能,您必须使用本机 Win32 共享 memory object 实现自己的消息队列版本。 在我的实验中,更换它后,性能明显提高。

请注意,如果您更改为 Win32 本机共享 memory,则必须注意“删除”共享 memory。 POSIX 共享 memory 和 Win32 共享 memory 有不同的删除策略。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM