プロトコルバッファとJSONまたはBSONの比較[終了]


90

プロトコルバッファーとBSON(バイナリーJSON)または一般的なJSONのパフォーマンス特性に関する情報はありますか?

  • ワイヤーサイズ
  • シリアル化速度
  • 逆シリアル化速度

これらは、HTTPでの使用に適したバイナリプロトコルのようです。私は、C#環境の長期的にはどちらが良いか疑問に思っています。

BSONProtocol Buffersで読んでいた情報がいくつかあります。


一部の人は、以前のprotobufの作者も含まれていると思いますが、フォーマットをシリアル化するには、大きいが安価な形式を使用して、出力を高速の標準コンプレッサーで圧縮する方が良いと考えています。
CodesInChaos


質問自体で特定の比較方法が提案されるまで、これを再開するべきではないと思います(そうでない場合、これはかなり意見が
分かれた

回答:


64

Thriftは、プロトコルバッファのような別の代替手段でもあります。

これらのテクノロジーのシリアライゼーション/デシリアライゼーションおよびワイヤサイズに関するJavaコミュニティからの優れたベンチマークがあります:https : //github.com/eishay/jvm-serializers/wiki

一般に、JSONのワイヤーサイズはわずかに大きく、DeSerはわずかに悪くなりますが、ユビキタス性と、ソースIDLなしで簡単に解釈できる機能に勝っています。最後のポイントは、Apache Avroが解決しようとしていることであり、パフォーマンスの点で両方に勝っています。

MicrosoftはC#NuGetパッケージをリリースしましたMicrosoft.Hadoop.Avroを


1
小さなメッセージサイズは自動的に高速パフォーマンスに変換されません。この記事を参照してくださいsoa.sys-con.com/node/250512
vtd-xml-author

1
良いリンク。私がよくわからないのはAvroに関するコメントだけです-それはそのコアユースケース(類似のデータエントリのトン)に対してより効率的に機能しますが、このベンチマーク(処理をテストする)では非常に高速に動作しないようです単一の要求)
StaxMan、2011年

CoDec、MoDem .... "SeDes"のほうが好き:)
nawfal


52

以下は、人気のある.NETシリアライザーのパフォーマンスを示す最近のベンチマークです。

バーニング僧侶ベンチマークは、包括しながら、簡単なPOCOのシリアライズのパフォーマンスを示してNorthwindのベンチマークは、Microsoftのノースウィンドデータセットのすべての表の行をシリアライズを合わせた結果を示しています。

ここに画像の説明を入力してください

基本的に、プロトコルバッファー(protobuf-net)は、.NETの最速の基本クラスライブラリシリアライザー(XML DataContractSerializer)よりも約7倍高速です。また、Microsoftの最もコンパクトなシリアル化形式(JsonDataContractSerializer)よりも2.2倍も小さいため、競合製品よりも小さくなっています。

ServiceStackのText シリアライザーは、Jsonシリアライザーがprotobuf-netよりも2.58 遅いだけであるバイナリprotobuf-netのパフォーマンスに最も近いものです。


1
素晴らしい投稿ですが、可能であれば、平均を表示するときは常に棒グラフにエラーバーを置く必要があります。
jtromans 2013年

JILがテストに含まれていないのはなぜですか?(なぜあなたは何か考えがありますか?)
Royi Namir 2014

22

プロトコルバッファは、ワイヤ用に設計されています。

  1. 非常に小さいメッセージサイズ-1つの側面は、非常に効率的な可変サイズの整数表現です。
  2. 非常に高速なデコード-バイナリプロトコルです。
  3. protobufは、メッセージのエンコードとデコードのための非常に効率的なC ++を生成します-ヒント:すべてのvar-integersまたは静的サイズのアイテムをエンコードすると、確定的な速度でエンコードとデコードが行われます。
  4. 非常に豊富なデータモデルを提供します。非常に複雑なデータ構造を効率的にエンコードします。

JSONは単なるテキストであり、解析する必要があります。ヒント: "billion" intをエンコードすると、かなりの文字数が必要になります。Billion= 12文字(長尺)、バイナリでは、uint32_tに収まりますdoubleをエンコードしようとするとどうなるでしょうか。それはFAR FARより悪くなるでしょう。


4
ただし、継承を処理しないという不幸な欠点があります。構成は有効な代替手段ですが、継承ではなく構成を使用するようにデータ転送オブジェクトに強制されないようにします。
Mark Green

4
私は...拡張機能は継承と非常によく似た方法で使用することができると信じてdevelopers.google.com/protocol-buffers/docs/reference/...
kralyk

1
はい、拡張機能は非常に良い点です。私は実際に仕事で毎日使用しています。
Yngve Sneen Lindal 2012

「プロトコルバッファーはワイヤー用に設計されています」「ワイヤー」とは何ですか?
Marcos Pereira

@marcospgp the wireはネットワークのみを意味します。今、非常に多くの無線ネットワークを使用していると、奇妙に聞こえるかもしれません。
Victor Yarema
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.