2017-12-20 12 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は、一連のキーと値のペアからオンザフライでオブジェクトを構築する必要があるため、逆シリアル化が遅いです。パフォーマンスが懸念される場合は、FlatbufferまたはCapn'Protoを試してください。これらは、オブジェクトの構築を必要としないが、ディスク上のコストがかかる可能性があり、その他の欠点がある代替品です。

+0

を参照してください。どうもありがとうございました。上のコードとプロトコルのメッセージに基づいて、あなたはお勧めしますか? * flatbuffer *または* Capn'Proto *?私はそれらのどれも使用していない。したがって、私は専門家の提案を探しています。 –

+1

@RaviJoshiどちらも可能なソリューションです。両方を試し、独自のベンチマークを実行することを強くお勧めします。あなたの実際の使用モデル/パターンによってはトレードオフが多すぎます。 – CyberSnoopy

関連する問題