Protokollpuffer gegen JSON oder BSON [geschlossen]

90

Hat jemand Informationen zu den Leistungsmerkmalen von Protokollpuffern gegenüber BSON (binäres JSON) oder gegenüber JSON im Allgemeinen?

  • Drahtstärke
  • Serialisierungsgeschwindigkeit
  • Deserialisierungsgeschwindigkeit

Dies scheinen gute binäre Protokolle für die Verwendung über HTTP zu sein. Ich frage mich nur, was auf lange Sicht für eine C # -Umgebung besser wäre.

Hier sind einige Informationen, die ich über BSON und Protokollpuffer gelesen habe .

Jeff Fleischbällchen Yang
quelle
Einige argumentieren (ich denke, dies schließt einen ehemaligen Protobuf-Autor ein), dass es eine bessere Idee ist, ein größeres, aber billigeres Serialisierungsformat zu verwenden und dann die Ausgabe mit einem schnellen Standardkompressor zu komprimieren.
CodesInChaos
Ich denke nicht, dass dies wieder geöffnet werden sollte, bis eine bestimmte Vergleichsmethode in der Frage selbst vorgeschlagen wird (ansonsten ist dies für eine eher meinungsgebundene Diskussion / zu breit)
YakovL

Antworten:

64

Thrift ist ebenfalls eine Alternative wie Protokollpuffer.

Es gibt gute Benchmarks aus der Java-Community zur Serialisierung / Deserialisierung und Kabelgröße dieser Technologien: https://github.com/eishay/jvm-serializers/wiki

Im Allgemeinen hat JSON eine etwas größere Drahtgröße und ein etwas schlechteres DeSer, gewinnt jedoch an Allgegenwart und der Fähigkeit, es ohne die Quell-IDL leicht zu interpretieren. Der letzte Punkt ist etwas, das Apache Avro zu lösen versucht, und er übertrifft beide in Bezug auf die Leistung.

Microsoft hat ein C # NuGet-Paket Microsoft.Hadoop.Avro ​​veröffentlicht .

Michael Greene
quelle
1
Kleine Nachrichtengröße führt nicht automatisch zu schneller Leistung. Siehe diesen Artikel soa.sys-con.com/node/250512
vtd-xml-author
1
Gute Verbindung; Das einzige, bei dem ich mir nicht sicher bin, ist ein Kommentar zu Avro - obwohl es für seine Kernanwendungsfälle (Tonnen ähnlicher Dateneinträge) effizienter arbeiten könnte, scheint es in diesem Benchmark (der die Handhabung eines Avro testet) nicht sehr schnell zu funktionieren Einzelanfrage)
StaxMan
CoDec, MoDem .... Ich mag "SeDes" besser :)
Nawfal
52

Hier sind einige aktuelle Benchmarks, die die Leistung beliebter .NET-Serializer zeigen.

Die Burning Monks-Benchmarks zeigen die Leistung der Serialisierung eines einfachen POCO, während die umfassenden Northwind-Benchmarks die kombinierten Ergebnisse der Serialisierung einer Zeile in jeder Tabelle des Northwind-Datasets von Microsoft zeigen.

Geben Sie hier die Bildbeschreibung ein

Grundsätzlich sind Protokollpuffer ( protobuf-net ) etwa 7x schneller als die schnellste Basisklassenbibliothek Serializer in .NET (XML DataContractSerializer). Es ist auch kleiner als die Konkurrenz, da es auch 2,2-mal kleiner ist als das kompakteste Serialisierungsformat von Microsoft (JsonDataContractSerializer).

Die Text-Serialisierer von ServiceStack entsprechen am ehesten der Leistung des binären Protobuf-Netzes, wobei der Json-Serializer nur 2,58-mal langsamer als der Protobuf-Netz ist.

Mythos
quelle
1
Toller Beitrag - aber wenn möglich, sollten Sie immer Fehlerbalken in Ihre Balkendiagramme einfügen, wenn Sie Durchschnittswerte anzeigen.
jtromans
Warum ist JIL nicht in den Tests enthalten? (Haben Sie eine Idee warum?)
Royi Namir
22

Protokollpuffer sind für den Draht ausgelegt:

  1. Sehr kleine Nachrichtengröße - Ein Aspekt ist die sehr effiziente Ganzzahldarstellung mit variabler Größe.
  2. Sehr schnelle Dekodierung - es ist ein binäres Protokoll.
  3. protobuf generiert supereffizientes C ++ zum Codieren und Decodieren der Nachrichten - Hinweis: Wenn Sie alle var-integers oder statisch großen Elemente darin codieren, wird es mit deterministischer Geschwindigkeit codiert und decodiert.
  4. Es bietet ein SEHR reichhaltiges Datenmodell, das sehr komplexe Datenstrukturen effizient codiert.

JSON ist nur Text und muss analysiert werden . Hinweis: Das Codieren einer "Milliarde" int würde ziemlich viele Zeichen erfordern: Milliarden = 12 Zeichen (lange Skala), binär passt es in ein uint32_t. Was ist nun mit dem Versuch, ein Double zu codieren? das wäre weitaus schlimmer.

Hassan Syed
quelle
4
Es hat jedoch den unglücklichen Nachteil, dass Vererbung nicht behandelt wird, und obwohl Komposition eine gültige Alternative ist, möchte ich nicht von meinem Datenübertragungsobjekt gezwungen werden, Komposition anstelle von Vererbung zu verwenden.
Mark Green
4
Ich glaube, dass Erweiterungen auf eine Weise verwendet werden können, die der Vererbung sehr ähnlich ist ... developer.google.com/protocol-buffers/docs/reference/…
kralyk
1
Ja, Erweiterungen sind ein sehr guter Punkt. Ich benutze es jeden Tag in der Praxis bei der Arbeit.
Yngve Sneen Lindal
"Protokollpuffer sind für den Draht ausgelegt" Was ist "der Draht"?
Marcos Pereira
@marcospgp the wirebedeutet nur Netzwerk. Wenn wir jetzt so viele drahtlose Netzwerke verwenden, klingt das vielleicht komisch.
Victor Yarema