15

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

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

使用 google 协议缓冲区示例 Boost Asio

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

4

1 回答 1

24

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

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

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

附录

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

请参阅优化提示:

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

于 2011-11-08T13:29:01.227 回答