binär codeIn einem Kommentar zum vorherigen Artikel hatte Albert Weinert angeregt, auch JSON in den Vergleich mit einzubeziehen.
Da JSON, JavaScript und Konsorten wirklich nicht meine Welt sind, hat kurzer Hand Albert den Vergleich um drei verschiedene JSON Serialisierer ergänzt. Wer “den Albert” kennt, weis dass er keine halben Sachen macht. Ich schickte im ein kleines Testprojekt und erhielt ein komplettes Benchmark Programm zurück. Im Verlauf der Kommunikation brachte mir Albert auch JSON etwas näher und korrigierte damit meinen Blickwinkel. JSON bedeutet zwar namentlich JavaScript Object Notation und in der Wikipedia steht in der Erläuterung dazu:

Jedes gültige JSON-Dokument soll ein gültiges JavaScript sein …

Dies bedeutet aber nicht unbedingt, das JSON nur für JavaScript verwendet werden kann. Vielmehr stellt das JSON Format ein schlankes Textabbild des serialisierten Objekts ohne großen Overhead dar. Die gängigen JSON Serialisierer bieten alle sehr einfach zu handhabende Methoden zum Serialisieren und Deserialisieren von Objekten.

Zum direkten Vergleich der Effektivität verschiedener Methoden und Formate der Serialisierung, sind jetzt insgesamt fünf Serialisierer am Start. Die im Benchmark verwendeten Formatkürzel sowie die entsprechenden Produkte sind wie folgt aufgeschlüsselt.

  1. bin:           BinaryFormatter
  2. xml:          XmlSerializer
  3. jsondata:  DataContractJsonSerializer
  4. jsonweb:  JavaScriptSerializer
  5. jsonnet:    Json.NET von James Newton-King.

Um einheitliche Testbedingungen zu schaffen, wird für jeden Durchgang die benötigte Anzahl an Datensätzen einmal erzeugt und für alle Serialisierer verwendet. Jeder Serialisierer wird zweimal, einmal mit und einmal ohne GZip Komprimierung, verwendet und die benötigte Zeit in Millisekunden sowie die übertragene Datenmenge in Bytes erfasst. Es werden fünf Durchgänge mit 10, 100, 1.000, 10.000 und 100.000 Elementen ausgewertet.

Format Count Compression Milliseconds Bytes Transfered
bin 10
10
gzip 1
2
2.609
1.390
xml 10
10
gzip 1
2
3.638
972
jsondata 10
10
gzip 2
3
2.318
844
jsonweb 10
10
gzip 2 1.608
801
jsonnet 10
10
gzip
1
1.608
801
Format Count Compression Milliseconds Bytes Transfered
bin 100
100
gzip 2
3
18.559
8.832
xml 100
100
gzip 1
2
33.344
6.243
jsondata 100
100
gzip 1
3
22.934
5.717
jsonweb 100
100
gzip 8
5
15.834
5.382
jsonnet 100
100
gzip 1
2
15.834
5.382
Format Count Compression Milliseconds Bytes Transfered
bin 1.000
1.000
gzip 16
21
177.939
80.238
xml 1.000
1.000
gzip 9
22
329.675
58.287
jsondata 1.000
1.000
gzip 9
14
228.905
53.838
jsonweb 1.000
1.000
gzip 17
22
157.905
50.209
jsonnet 1.000
1.000
gzip 7
43
157.905
50.209
Format Count Compression Milliseconds Bytes Transfered
bin 10.000
10.000
gzip 125
214
1.772.619
795.178
xml 10.000
10.000
gzip 69
185
3.298.716
580.353
jsondata 10.000
10.000
gzip 62
130
2.290.386
536.307
jsonweb 10.000
10.000
gzip 116
183
1.580.386
500.012
jsonnet 10.000
10.000
gzip 51
116
1.580.386
500.012
Format Count Compression Milliseconds Bytes Transfered
bin 100.000
100.000
gzip 1.441
2.248
17.700.411
7.883.815
xml 100.000
100.000
gzip 883
1.584
32.885.009
5.782.222
jsondata 100.000
100.000
gzip 582
1.328
22.886.615
5.349.126
jsonweb 100.000
100.000
gzip 1.151
1.833
15.786.615
4.987.282
jsonnet 100.000
100.000
gzip 570
1.156
15.786.615
4.987.282

Wie in obigen Tabellen ersichtlich, setzen sich die beiden JSON Serialisierer JavaScriptSerializer und Json.NET in der Datengröße deutlich ab. Interessant auch die Beobachtung, dass beide Serialisierer die exakt gleiche Datenmenge übertragen.
Json.NET scheint, im Vergleich zum JavaScriptSerializer, effizientere Methoden zur Serialisierung zu verwenden, da er die Daten zum Teil doppelt so schnell liefert.

Interessierte können sich das Projekt gerne für eigene Tests herunterladen.

SerializeTesting.zip

Fazit:

Wer, wie ich, bis dato JSON bei der Serialisierung immer übersehen hat, sollte dies schleunigst ändern. Man sollte einfach das JS für JavaScript in JSON nicht überbewerten. Beherzigt man diesen Rat, hat man ein schlankes und schnelles Format zur Serialisierung der meisten .NET Objekte.
An dieser Stelle möchte ich mich noch einmal besonders bei Alber Weinert für die tatkräftige Unterstützung und das zurechtrücken meiner Sichtweise bedanken.

Technorati-Tags: | | | | |
Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitten "kicken" sie ihn.
kick it on dotnet-kicks.de