データをシリアライズ/デシリアライズするために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