Bewertung: 5.0 von 9 Benutzern
klaus_b
In 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.
- bin: BinaryFormatter
- xml: XmlSerializer
- jsondata: DataContractJsonSerializer
- jsonweb: JavaScriptSerializer
- 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.
Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitten "kicken" sie ihn.
