使用谷歌协议缓冲区的Boost.Asio

时间:2011-11-08 12:50:13

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

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

我搜索谷歌的样本,但只能提出这个例子:

Boost Asio with google protocol buffers sample

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

1 个答案:

答案 0 :(得分:22)

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

C ++ Protobuf库使用std :: string来表示它反序列化的消息的字符串字段,这意味着Protobuf会为您收到的每条消息中的每个字符串字段执行免费存储分配。这使得Protobuf在高频率消息传输方面表现不佳。

如果可以的话,我会到处使用Protobuf。它是制作丰富,复杂,平台无关,前后兼容协议的绝佳工具。

附录

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

请参阅优化提示:

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