使用协议缓冲区更快地进行挑选的建议

Suggestions for faster deserialization using Protocol Buffers

本文关键字:挑选 协议 缓冲区      更新时间:2023-10-16

我正在使用协议缓冲区,以序列化/对数据进行序列化。我已经定义了协议缓冲消息文件文件:

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。这些替代方案不需要任何对象构造,但(可能)在磁盘上花费了更多的成本,并且还有其他缺点。