我目前正在研究如何改进现有的c ++网络手工序列化机制,维护现有的二进制协议。 第一种方法是使用Boost.Asio使用Boost.Serialisation使用二进制序列化对其进行编码。无论如何,它发现它比我们目前的手工制作实施有点慢(10%)。任何人都有关于使用谷歌protobuf和Boost.Asio的实际_real_work_经验?
我搜索谷歌的样本,但只能提出这个例子:
Boost Asio with google protocol buffers sample
有人在任何实际项目中都这样做过吗?我对性能数据非常感兴趣,因为它必须非常快......
答案 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