c++ - Boost.Asio 与谷歌 Protocol Buffer

标签 c++ boost boost-asio protocol-buffers boost-serialization

我目前正在研究如何改进我们当前的 c++ 网络手工序列化机制,以维护我们现有的二进制协议(protocol)。 采用的第一种方法是使用 Boost.Asio 和 Boost.Serialisation 使用二进制序列化对其进行编码。无论如何,事实证明它比我们当前的手工实现要慢一些(10%)。任何人都有关于使用 google protobuf 和 Boost.Asio 的实际_real_work_经验?

我在谷歌上搜索了示例,但只能想出这个示例:

Boost Asio with google protocol buffers sample

有人在任何实际项目中这样做过吗?我对性能数据非常感兴趣,因为这必须非常快......

最佳答案

对于复杂的低消息速率协议(protocol),我们使用 boost::asio 和 Protobuf。对于简单、高消息速率的协议(protocol),我们使用 boost::asio 和自定义序列化。

C++ Protobuf 库使用 std::string 来表示它反序列化的消息的字符串字段,这意味着 Protobuf 会为您收到的每条消息中的每个字符串字段执行免费存储分配。这使得 Protobuf 对于真正高频消息传递的性能不是很好。

如果可以的话,我会在任何地方使用 Protobuf。它是制作丰富、复杂、独立于平台、向前和向后兼容的协议(protocol)的绝佳工具。

附录

由于似乎人们正在阅读此答案,因此我应该分享一下,我了解到,在 C++ Protobuf 中,您可以重用反序列化消息对象来减少阅读时的 malloc 频率。

查看优化提示:

https://developers.google.com/protocol-buffers/docs/cpptutorial

关于c++ - Boost.Asio 与谷歌 Protocol Buffer ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8050616/

相关文章:

c++ - 为什么在 C++0x 或 Boost.Thread 中没有针对多个互斥锁的作用域锁?

c++ bad_weak_ptr 错误

c++ - 找不到以下 Boost 库 : boost_asio

c++ - 带有 cpp-netlib 的 Https 服务器

c++ - Boost async_read 没有给我一个 "end of frame"标志

数组名称的 C++ 值

c++ - 在内存使用方面,c++ 中的 map 和 unordered_map 有什么区别吗?

c++插入空 vector 不能使用大括号

c++ - #include inside 函数体不起作用 (CDT/Eclipse C++)

c++ - boost::property_:tree - 解析和处理数据