2017-12-20 5 views
0

Ich verwende Protocol Buffers, um die Daten serialisieren/deserialisieren. Ich habe die Protokollpuffer-Nachrichtendatei wie folgt definiert:Vorschläge für schnellere Deserialisierung mit Protokollpuffer

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; 
} 

Ich bin in der Lage, die serialisierten Daten zu empfangen. Ich verwende ParseFromArray API wie folgt:

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 
} 

Die oben genannten Arbeiten, aber es dauert genug Zeit, um die Daten zu deserialisieren. Im Durchschnitt dauert es etwa 96 ms in Ubuntu 14.04 LTS 64 Bit OS. Nur zur Information, druckte ich auch msg.size() und fand es ungefähr 3773550.

Ich bin auf der Suche nach Vorschlägen zur Deserialisierung der Daten viel schneller als dies.

Antwort

1

Kurze Antwort, es könnte keinen Weg geben.

Protobuf ist langsam zu deserialisieren, da es Objekte on-the-fly aus einer Reihe von Schlüssel-Wert-Paaren erstellen muss. Wenn die Leistung Ihr Anliegen ist, versuchen Sie Flatbuffer oder Capn'Proto. Dies sind Alternativen, die keine Objektkonstruktion benötigen, aber (möglicherweise) mehr auf der Festplatte kosten und andere Nachteile aufweisen.

+0

Ich sehe. Vielen Dank. Basierend auf der obigen Code- und Protokollnachricht, welche schlagen Sie vor? * Flatbuffer * oder * Capn'Proto *? Ich habe nie einen von ihnen benutzt. Daher suche ich nach Expertenvorschlägen. –

+1

@RaviJoshi Beide sind mögliche Lösungen, ich schlage vor, Sie beide versuchen und Ihren eigenen Benchmark laufen. Es gibt zu viele Kompromisse abhängig von Ihrem tatsächlichen Nutzungsmodell/Muster. – CyberSnoopy