web-dev-qa-db-ja.com

AvroとProtobufのパフォーマンスメトリック

kafkaを使用してメッセージを保存し、非常に多くのメッセージをプッシュしています(1分間に> 30k)。関連性があるかどうかはわかりませんが、kafkaメッセージのプロデューサーであるコードはjrubyにあります。

メッセージのシリアル化と逆シリアル化も、システムのパフォーマンスに影響を与えます。

誰かがシリアル化と逆シリアル化の速度の観点からAvroとProtocolBufferを比較するのを手伝ってもらえますか?.

10
Aditya Sanghi

私はあなたにこれを言うのは嫌ですが、あなたの質問に対する簡単な答えはありません。

シリアル化フォーマットのパフォーマンスは、多くの要因に依存します。まず第一に、パフォーマンスはフォーマット自体よりもimplementationのプロパティです。あなたが本当に知りたいのは、各フォーマットの特定のJRuby実装がどれだけうまく機能するかです(または、ラップしているだけの場合は、Java実装)。答えは大きく異なる可能性があります。 C++のような他の言語での答え。

さらに、パフォーマンスはライブラリの使用方法によって異なります。多くのライブラリのAPIは、「簡単で遅い」方法と「速くて難しい」方法の間のトレードオフを提供します。最適化するときは、ドキュメントを注意深く調べ、ライブラリの作成者からのサンプルコードを探して、最大のパフォーマンスを引き出す方法を学ぶ必要があります。

最後に、そして最も重要なことですが、パフォーマンスは、使用しているデータによって大きく異なります。さまざまな形式と実装により、さまざまな種類のデータが最適化されます。たとえば、文字列が多いデータは、数値が多いデータとは非常に異なるコードパスを実行します。すべての形式(JSONやXML *も含む)について、他のすべての形式よりもパフォーマンスが優れている1つのユースケースを見つけることは常に可能です。図書館の著者からのベンチマークは、図書館に有利なユースケースを強調する傾向があるため、注意してください。

残念ながら、どちらの形式の方がパフォーマンスが優れているかを本当に知りたい場合は、各ライブラリを使用する2つのバージョンのコードを記述し、それらを比較するしか方法がありません。外部ベンチマークはあなたに本当の答えを与えることができません。

(私はProtobuf v2と Cap'n Proto の作成者なので、シリアル化のベンチマークを調べてパフォーマンスについて考えることに多くの時間を費やしました。)

* XMLについて冗談です。

33
Kenton Varda