使用Google Protocol Buffers的Boost.Asio

17

我目前正在研究改进我们当前的C++网络自制序列化机制,同时保持我们现有的二进制协议。

首先采用的方法是使用Boost.Asio和二进制序列化编码。然而,结果显示它比我们当前的手工实现稍微慢一些(10%)。有没有人在实际工作中使用过Google protobuf和Boost.Asio?

我在Google上搜索示例,但只找到了这个例子:

Boost Asio与Google Protocol Buffers示例

有人在任何实际项目中使用过这个吗?我非常关心性能数据,因为这必须非常快...


你可以附上显示该图形的图片吗? - BЈовић
抱歉,我不能透露它 :( - jvaz
1个回答

26
我们使用boost::asio和Protobuf处理复杂的、低速消息频率的协议。对于简单的、高速消息频率的协议,我们使用boost::asio和自定义序列化。
C++ Protobuf库使用std::string来表示它反序列化的消息的字符串字段,这意味着Protobuf会为您接收到的每个消息中的每个字符串字段执行一次堆分配。这使得Protobuf在处理高频消息时表现不佳。
尽管如此,我仍然会尽可能地使用Protobuf。它是一个神奇的工具,可以创建丰富、复杂、平台无关、前后向兼容的协议。
补充说明:
由于似乎有人在阅读这篇答案,我应该分享一下我学到的东西:在C++ Protobuf中,您可以重用反序列化消息对象以减少读取时的malloc频率。
请参见优化提示:

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


谢谢James的贡献,非常感谢 :) - jvaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接