/ / Sugestie szybszej deserializacji przy użyciu buforów protokołu - c ++, serializacja, bufory protokołów

Sugestie do szybszej deserializacji za pomocą Protocol Buffers - c ++, serializacja, bufory protokołów

ja używam Bufory protokołów w celu serializacji / deserializacji danych. Zdefiniowałem plik komunikatów buforów protokołu w następujący sposób:

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

Jestem w stanie odbierać dane seryjne. ja używam ParseFromArray API w następujący sposób:

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
}

Powyższe działa, ale potrzeba deserializacji danych. Średnio zajmuje około 96 ms w Ubuntu 14.04 LTS 64 Bit OS. Po prostu dla informacji również wydrukowałem msg.size() i znalazłem go około 3773550.

Szukam sugestii, aby znacznie szybciej odrrializować dane.

Odpowiedzi:

1 dla odpowiedzi № 1

Krótka odpowiedź, nie może być mowy.

Protobuf powoli się deserializuje, ponieważ musikonstruuj obiekty w locie z serii par klucz-wartość. Jeśli masz problem z wydajnością, spróbuj zastosować bufor termiczny lub Capn „Proto. Są to alternatywy, które nie wymagają budowy obiektu, ale (być może) kosztują więcej na dysku i mają inne wady.