데이터를 직렬화/역 직렬화하기 위해 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;
}
직렬화 된 데이터를받을 수 있습니다. 다음과 같이 나는 ParseFromArray 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에서 약 96ms가 소요됩니다. 정보를 얻으려면 msg.size()
도 인쇄하고 대략 3773550입니다.
나는 이보다 훨씬 더 빨리 데이터를 비 직렬화 할 제안을 찾고있다.
알 수 있습니다. 고맙습니다. 위의 코드 및 프로토콜 메시지를 바탕으로 어떤 것을 제안합니까? * flatbuffer * 또는 * Capn'Proto *? 나는 그들 중 누구도 사용하지 못했습니다. 그러므로 전문가의 제안을 찾고 있습니다. –
@RaviJoshi 둘 다 가능한 솔루션입니다. 두 가지를 모두 시도하고 자신의 벤치 마크를 실행하는 것이 좋습니다. 실제 사용 모델/패턴에 따라 너무 많은 트레이드 오프가 있습니다. – CyberSnoopy