2017-12-20 2 views
0

데이터를 직렬화/역 직렬화하기 위해 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입니다.

나는 이보다 훨씬 더 빨리 데이터를 비 직렬화 할 제안을 찾고있다.

답변

1

짧은 대답, 방법이 없을 수도 있습니다.

Protobuf는 일련의 키 - 값 쌍에서 즉석에서 개체를 생성해야하기 때문에 직렬화가 느립니다. 성능이 걱정된다면 플랫 버퍼 또는 Capn'Proto를 시도하십시오. 이들은 객체 생성이 필요 없지만 디스크에 더 많은 비용이들 수 있고 다른 단점이있는 대안입니다.

+0

알 수 있습니다. 고맙습니다. 위의 코드 및 프로토콜 메시지를 바탕으로 어떤 것을 제안합니까? * flatbuffer * 또는 * Capn'Proto *? 나는 그들 중 누구도 사용하지 못했습니다. 그러므로 전문가의 제안을 찾고 있습니다. –

+1

@RaviJoshi 둘 다 가능한 솔루션입니다. 두 가지를 모두 시도하고 자신의 벤치 마크를 실행하는 것이 좋습니다. 실제 사용 모델/패턴에 따라 너무 많은 트레이드 오프가 있습니다. – CyberSnoopy

관련 문제