C ++シリアル化のパフォーマンス
-
11-07-2019 - |
質問
私は、異なるプロセスとコンピューター間で渡される単純なデータ構造の多くのシリアライズとデシリアライズを行う必要がある分散C ++アプリケーションを構築しています。
複雑なクラス階層のシリアル化には興味がありませんが、数値、文字列、データベクトルなどのいくつかの単純なメンバーを持つ構造体を送信することに興味があります。多くの場合、データベクトルのサイズは数メガバイトです。 テキスト/ XMLベースの方法は遅すぎると心配しています。文字列のエンコードや数字のエンディアンなどの問題が表面上で見るよりも複雑になる可能性があるため、私はこれを自分で書きたくありません
プロトコルバッファとboost.serializeを少し見てきました。文書によると、プロトコルバッファはパフォーマンスを重視しているようです。 Boostは、この特定のプロジェクトに非常に便利なデータ形式を指定するための外部言語を持たないという意味で、やや軽量に見えます。
だから私の質問はこれに帰着します:ブーストシリアル化が上記で説明した典型的なユースケースで高速であるかどうか誰にもわかりますか?
また、これに適したライブラリが他にもある場合は、喜んでお聞かせください。
解決
プロトコルバッファを強くお勧めします。これらは非常に使いやすく、優れたパフォーマンスを提供し、エンディアンネスや下位互換性などの問題を処理します。さらに魅力的なものにするために、シリアル化されたデータは、多数の言語実装のおかげで言語に依存しません。
他のヒント
ACEとACE TAOが思い浮かびますが、サイズと範囲が気に入らないかもしれません。 http://www.cs.wustl.edu/~schmidt/ACE.html
" fast"に関するクエリについてブースト。これは主観的な用語であり、要件(スループットなど)がわからなければ、それを答えることは困難です。自分でブーストのベンチマークを行っているわけではありません...
使用できるメッセージングレイヤーはありますが、おそらくブーストよりも遅いでしょう。ブーストで適切なソリューションを特定したと思いますが、私はACEと他のプロプライエタリなコミュニケーション/メッセージング製品のみを使用しました。
私の推測は、ブーストが十分に速いということです。以前のプロジェクトでそれを使用してディスクとの間でデータをシリアル化しましたが、パフォーマンスが問題になることはありませんでした。
私の回答では、シリアル化について説明しています一般、使用することを選択したシリアル化ライブラリを超えて役立つ場合があります。
そうは言っても、シリアル化(エンディアン文字列エンコード)の主な問題点のほとんどを知っているようです。バージョン管理と前方/後方互換性は除外しました。時間が重要でない場合は、独自のシリアル化コードを書くことをお勧めします。それは啓発的な経験であり、あなたが学ぶ教訓は非常に貴重です。私はあなたに警告しますが、それはあなたがそれらの肥大化のためにXMLベースのプロトコルを嫌うようになる傾向があるでしょう。 :)
プロジェクトで幸運を選んだ道。
boost.serializationは文字列のエンコードやエンディアンを気にしません。それがあなたにとって重要な場合、あなたはそれを使用しないことで同様にうまくいくでしょう。
ZeroCからICEを調べたい場合があります。 http://www.zeroc.com/
CORBAと同様に機能しますが、会社が完全に仕様を定めて定義している点が異なります。利点は、それほど多くはないため、実装が意図したとおりに機能することです。欠点は、サポートしていない言語を使用している場合、運が悪いことです。
明確に定義されたデータ構造のみを送信する場合は、おそらく ASNを参照する必要があります。 .1 エンコード方法論として?
先制的に最適化しないでください。最初に測定し、2番目に最適化します。