使用协议缓冲区更快地进行挑选的建议
Suggestions for faster deserialization using Protocol Buffers
我正在使用协议缓冲区,以序列化/对数据进行序列化。我已经定义了协议缓冲消息文件文件:
syntax = "proto3";
package Tutorial;
import "google/protobuf/timestamp.proto";
message PointCloud {
int32 width = 1;
int32 height = 2;
message Point {
float x = 1;
float y = 2;
float z = 3;
fixed32 rgb = 4;
}
repeated Point points = 3;
google.protobuf.Timestamp timestamp = 4;
}
我能够接收序列化数据。我使用的是解析API如下:
zmq::message_t msg;
int rc = zmq_socket.recv(&msg);
if (rc){
std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
Tutorial::PointCloud point_cloud;
point_cloud.ParseFromArray(msg.data(), msg.size());
std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
std::cout << "Time (ms): " << std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count()/1000.0 << std::endl
}
上面有效,但需要足够的时间才能使数据估算。平均而言,在Ubuntu 14.04 LTS 64位OS中,大约需要96毫秒。只是为了信息,我还打印了msg.size()
,并发现了3773550。
我正在寻找比此更快的建议的建议。
简短的答案,可能没有办法。
Protobuf速度很慢,因为它需要从一系列键值对即时构造对象。如果您的性能是您的,请尝试FlatBuffer或Capn'Proto。这些替代方案不需要任何对象构造,但(可能)在磁盘上花费了更多的成本,并且还有其他缺点。
相关文章:
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 如何使用url确定网站协议
- MSYS2 MinGW程序包中缺少grpc_cpp_plugin协议
- 用CMake构建C++协议
- 从原始字节解码协议缓冲区(以 C++为单位)
- 如何使用ZeroMQ为协议缓冲区编写自己的RPC实现
- 协议缓冲区字符串字段的文本编码
- 如何使用librdkafka设置明文协议(无SASL)的用户名和密码?
- 构建使用协议缓冲区(不含 APK)的 Android 可执行 gRPC 服务器
- 用于处理多个通信协议处理的设计类
- 无法使用 ReadBinaryProto Tensorflow 加载协议缓冲区
- 协议缓冲区的静态链接会导致与现有符号冲突
- 协议缓冲区ParseFromString不检查消息结尾
- 如何自定义wxApp来实现协议
- 与Qt交叉编译到Raspberry Pi 3B+通讯录(协议缓冲区)-错误符号查找错误
- 编译的谷歌协议缓冲区不工作(C++)
- 使用协议缓冲区创建通用反序列化程序
- 在协议缓冲区 c++ 中反序列化字符串数组
- 使用升压缓冲区使用 UDP 协议进行序列化和发送
- 使用协议缓冲区更快地进行挑选的建议