JSON ist langsam!?

Im Rahmen eines Vortrages über Webperformance Optimierung habe ich zunächst einmal den Mythos von JSON angekratzt. Nachdem heute ja ein REST Service als die Ultima Ratio betrachtet wird, muss die Datenmenge natürlich Im JavaScript Object Notation Format übertragen werden. Was für den Browser ganz gut ist, kann aber einen Webserver deutlich stärker belasten, als man glauben würde.

Ins Rennen gehen das SDF File, ein XML File und eine JSON Datei. Alle drei mit den gleich 91 Customers aus der Northwind Datenbank.

Die Dateigröße

In der ersten Performance Wertung geht es um reine Dateigröße. Das CSV Format trennt mit Semikolon und CRLF. Die Größe der Daten hat einen erheblichen Einfluss auf die Übertragungsgeschwindigkeit auch wenn man sagen muss, das eine http übliche Kompression es natürlich optimieren kann.

Format Größe Komprimiert Zip
CSV

12 KB

6 KB

XML

40 KB

8 KB

JSON

25 KB

7 KB

 

Der Parsertest

Erst durch einen Parser wird aus einem Datenstrom eine generische Liste. Für den Test wurden einfache Codeschnippsel genutzt ohne auf Optimierung zu achten. Genauso wie es vermutlich 99% der Entwickler tun, copy paste.

Der TXT parsing Code

   1:   List<Customers> list = new List<Customers>();
   2:   using (var fs = File.OpenRead(@"C:\temp\northwind.csv"))
   3:              using (var reader = new StreamReader(fs))
   4:              {
   5:                  while (!reader.EndOfStream)
   6:                  {
   7:                      var line = reader.ReadLine();
   8:                      var values = line.Split(';');
   9:                      list.Add(new Customers()
  10:                      {
  11:                          CustomerID = values[0],
  12:                          CompanyName = values[1],
  13:                          ContactName = values[2],
  14:                          ContactTitle = values[3],
  15:                          Address = values[4],
  16:                          City = values[5],
  17:                          Region = values[6],
  18:                          PostalCode = values[7],
  19:                          Country = values[8],
  20:                          Phone = values[9],
  21:                          Fax = values[10]
  22:                      });
  23:             }
  24:    }
  25:         

Der XML Parsing Code ist dank eingebauten System.XML.Serialization Namespace wesentlich kürzer

   1:  List<Customers> list = new List<Customers>();
   2:  var serializer = new XmlSerializer(typeof(List<Customers>));
   3:  using (var stream = File.OpenRead(@"c:\temp\northwind.xml"))
   4:       {
   5:          list = (List<Customers>)(serializer.Deserialize(stream));
   6:       }
   7:           

Zuletzt wird noch das JSON deserialisiert, mit dem Newtonsoft Parser. Dieser war in den Anfängen wesentlich schneller als der Microsoft eigene Datacontract serialisierer. Auch so ein Mythos der sich ungeprüft ewig hält.

   1:  using (StreamReader file = File.OpenText(@"c:\temp\northwind.json"))
   2:        {
   3:             JsonSerializer jser = new JsonSerializer();
   4:             List<Customers> list =
   5:                   (List<Customers>)jser.Deserialize(file, typeof(List<Customers>));
   6:        }

Das sind unsere drei Kandidaten die wir ins Rennen schicken. Gezählt werden die Systemticks per Stopwatch Klasse. Gleich vorweg, die Ergebnisse sind definitiv mit vorsichtig zu genießen, weil Einflüsse der benutzten Maschine so nicht ausgeschlossen werden können. Jeder mit einem Technik Studium wird den Satz “wer misst misst Mist” schon mal gehört haben.

Getestet wurde mit einer WPF Anwendung

image

Das Ergebnis zeigt fantastische Unterschiede zu Lasten von XML und erst Recht von JSON. Allerdings ändert sich beim zweiten Durchlauf das Ergebnis dramatisch.

Format 1st try Ticks 2nd try Ticks
CSV

1343

871

XML

349156

2927

JSON

479480

2308

Wahnsinn oder? These: der JIT (just in Time Compiler) muss die Librarys erst aus IL Binärcode erstellen und da hat er mit großen Bibliotheken wie Newtonsoft.Json einfach deutlich mehr zu tun.

Eindeutiger Sieger ist CSV das drei bzw. vier weniger Prozessorlast erzeugt wie seine Verfolger JSON und XML und noch dazu wesentlich weniger Bandbreite benötigt.

Kommentare sind geschlossen