2011-11-08 9 views
15

私は現在、既存のバイナリプロトコルを維持している現在のC++ネットワーク手作業シリアル化メカニズムを改善する方法を調査しています。 最初に取ったアプローチは、Boost.AsioとBoost.Serialisationをバイナリ直列化を使用してコード化することでした。とにかく、現在の手作業での実装よりやや遅い(10%)ことがわかりました。誰でもBoost.Asioと一緒にGoogleのprotobufを使用することに関する実際の_real_work_経験がありますか?Googleのプロトコルバッファを使用したBoost.Asio

私はサンプルのためにグーグルを検索するだけ来アップするために、この例でできた:

Boost Asio with google protocol buffers sample

は、実際のプロジェクトでこれを誰もやっていますか?これは非常に高速でなければならないので、私は非常に興味深いパフォーマンス数値を持っています。

+0

あなたは数字を示す画像を添付することはできますか? –

+0

申し訳ありません私はそれを開示することはできません:( – jvaz

答えて

22

複雑な低メッセージレートプロトコルにはboost :: asioとProtobufを使用します。シンプルで高いメッセージレートのプロトコルでは、boost :: asioとカスタムの直列化を行います。

C++ Protobufライブラリは、std :: stringを使用してデシリアライズするメッセージの文字列フィールドを表します。つまり、受け取ったすべてのメッセージの各文字列フィールドに対してProtobufによってフリーストア割り当てが実行されます。これにより、Protobufは本当に高頻度のメッセージングにはあまり効果的ではありません。

もし私ができるなら、私はどこでもProtobufを使用します。豊富で複雑でプラットフォームに依存しない、前方互換性と後方互換性のあるプロトコルを作成するための素晴らしいツールです。

補遺

の人がこの回答を読んでいるようには思われますので、私はC++いるProtobufであなたは再利用することができます読み取る際に、デシリアライゼーションメッセージがオブジェクトがmalloc関数の頻度を低減することを学んだことを共有する必要があります。

参照の最適化のヒント:

https://developers.google.com/protocol-buffers/docs/cpptutorial

+0

あなたの入力のためのジェームズありがとう、非常に感謝:) – jvaz

関連する問題