2010-01-04 14 views
85

Czy ktoś ma jakiekolwiek informacje na temat charakterystyki wydajnościowej Buforów protokołów względem BSON (binarny JSON) lub ogólnie JSON?Bufory protokołów a JSON lub BSON

  • rozmiar drutu
  • prędkość serializacji
  • prędkość Deserializacji

To wydaje się dobre protokołów binarnych do wykorzystania przez HTTP. Zastanawiam się, który byłby lepszy na dłuższą metę dla środowiska C#.

Oto niektóre informacje, które czytałem na temat BSON i Protocol Buffers.

+0

Niektórzy twierdzą (myślę, że obejmuje to byłego autora protobuf), że lepiej jest użyć formatu większego, ale tańszego do serializowania, a następnie skompresować wyjście za pomocą standardowego kompresora. – CodesInChaos

+0

http://devblog.corditestudios.com/blog/2012/10/29/bson-vs-yaml-vs-protobuf/ – laike9m

Odpowiedz

63

Thrift to kolejna alternatywa podobna do buforów protokołu.

Istnieją dobre odniesienia ze społeczności Java na serializacji/deserializacji i rozmiaru drutu tych technologii: http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking

W ogóle, JSON ma nieco większy rozmiar drutu i nieco gorszą deser, ale wygrywa w wszechobecności i zdolność do zinterpretuj to łatwo bez IDL źródła. Ostatnia kwestia to coś, co próbuje rozwiązać Apache Avro i bije zarówno pod względem wydajności.

Firma Microsoft wydała pakiet C# NuGet Microsoft.Hadoop.Avro.

+1

Mały rozmiar wiadomości nie przekłada się automatycznie na szybką perforację, zobacz ten artykuł http://soa.sys-con.com/node/250512 –

+1

Dobry link; jedyną rzeczą, której nie jestem pewien, jest komentarz do Avro - podczas gdy mógłby wydajniej pracować dla swoich podstawowych przypadków użycia (ton podobnych wpisów danych), nie wydaje się, aby działał bardzo szybko w tym benchmarku (który testuje obsługę pojedyncza prośba) – StaxMan

+0

CoDec, MoDem .... Ja lubię "SeDes" lepiej :) – nawfal

21

bufory protokół jest przeznaczony do Drut

  1. bardzo mały rozmiar wiadomości - jeden aspekt jest bardzo wydajny zmiennej wielkości reprezentacja całkowitą.
  2. Bardzo szybkie dekodowanie - jest to protokół binarny.
  3. protobuf generuje super efektywny C++ do kodowania i dekodowania wiadomości - wskazówka: jeśli zakodujesz wszystkie zmienne liczby całkowite lub elementy o rozmiarze statycznym, zakodowane i dekodowane będą z deterministyczną szybkością.
  4. Oferuje bardzo bogaty model danych - wydajne kodowanie bardzo złożonych struktur danych.

JSON jest po prostu tekstem i musi być zanalizowany. podpowiedź: kodowanie int do "miliarda" wymagałoby sporo znaków: Billion = 12 znaków (długa skala), w formacie binarnym pasuje do uint32_t. A co z próbą zakodowania double? to byłoby DUŻO DUŻE.

+3

Ma jednak dość niefortunną wadę nietraktowania dziedziczenia i podczas gdy kompozycja jest poprawna alternatywnie, wolę, aby mój obiekt przesyłania danych nie był zmuszany do używania kompozycji, a nie dziedziczenia. –

+4

Wierzę, że rozszerzenia mogą być używane w sposób bardzo podobny do dziedziczenia ... https://developers.google.com/protocol-buffers/docs/reference/cpp-generated#extension – kralyk

+1

Tak, rozszerzenia są bardzo dobrym punktem. Używam go w praktyce w pracy każdego dnia. –

51

Oto some recent benchmarks pokazujący działanie popularnych .NET Serializers.

The Burning Monks benchmarks pokazują wydajność serializacji prostych POCO, podczas gdy kompleksowe Northwind benchmarks pokazują połączone wyniki serializacji wiersza w każdej tabeli zestawu danych Northwind firmy Microsoft.

enter image description here

Zasadniczo bufory Protocol (protobuf-net) wynosi około 7x szybciej niż najszybsze klasy bazowej biblioteki Serializatora w .NET (XML DataContractSerializer). Jest także mniejszy niż konkurencja, ponieważ jest również mniejszy niż najbardziej kompaktowy format serializacji Microsoftu (JsonDataContractSerializer) firmy Microsoft.

ServiceStack za serializers tekstowe są najbliżej dopasowanie wydajności binarnym protobuf netto gdzie jego Json Serializer jest tylko 2.58x wolniej niż protobuf netto.

+1

Świetny post - ale jeśli to możliwe, zawsze powinieneś umieszczać paski błędów na wykresach słupkowych, pokazując średnie. – jtromans

+0

Dlaczego JIL nie jest uwzględniony w testach? (czy masz jakiś pomysł dlaczego?) –