15

私は現在、既存のバイナリ プロトコルを維持しながら、現在の C++ ネットワークの手作りのシリアル化メカニズムを改善する方法を調査しています。最初に取られたアプローチは、Boost.Asio とバイナリ シリアライゼーションを使用する Boost.Serialisation を使用してコーディングすることでした。とにかく、現在の手作りの実装よりもやや遅い (10%) ことが判明しました。Boost.Asio と一緒に google protobuf を使用することについて、実際の _real_work_ 経験がある人はいますか?

Google でサンプルを検索しましたが、次の例しか思いつきませんでした。

Google プロトコル バッファ サンプルで Asio をブーストする

実際のプロジェクトでこれを行った人はいますか? これは非常に高速でなければならないので、パフォーマンスの数値に非常に興味があります...

4

1 に答える 1

24

複雑でメッセージレートの低いプロトコルには、boost::asio と Protobuf を使用します。シンプルでメッセージ レートの高いプロトコルの場合は、boost::asio とカスタム シリアライゼーションを行います。

C++ Protobuf ライブラリは std::string を使用して、逆シリアル化するメッセージの文字列フィールドを表します。これは、受信するすべてのメッセージのすべての文字列フィールドに対して、Protobuf によって空きストア割り当てが実行されることを意味します。そのため、Protobuf は、非常に頻度の高いメッセージングではあまりパフォーマンスが高くありません。

ただし、可能であればどこでも Protobuf を使用します。これは、リッチで複雑な、プラットフォームに依存しない、前後互換性のあるプロトコルを作成するための素晴らしいツールです。

補遺

人々がこの回答を読んでいるように見えるので、C++ Protobuf では、デシリアライゼーション メッセージ オブジェクトを再利用して、読み取り時の malloc 頻度を減らすことができることを学んだことを共有する必要があります。

最適化のヒントを参照してください。

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

于 2011-11-08T13:29:01.227 に答える