Interessanterweise gibt es immer noch Menschen gibt, die über JSON-Parser Leistung kümmern;)
Vor etwa drei Jahren habe ich meine eigene JSON-Parser mit dem Ziel entwickelt, um es schnell und mit einem geringen Speicherfußdruck. Seitdem war ich interessiert, wie es mit anderen verglichen wird, besonders mit NSJSONSerialization und JSONKit. Ich habe eine Reihe von Benchmarks, die ich gelegentlich ausführen, um zu überprüfen, wie neue Compiler und Betriebssysteme die Parser verbessert haben. Ich habe auch Bontos Bank gegabelt, ein paar Fehler korrigiert, ein paar pathologische JSON-Dateien hinzugefügt und meinen eigenen Parser hinzugefügt.
Nun, ich kann bestätigen, dass in den letzten Jahren die Leistung von NSJSONSerialization
wurde stark verbessert. Es ist jetzt vergleichbar mit JSONKit für viele Arbeitslasten. Wenn ich mich recht erinnere, dauerte ein bestimmter Test 690ms für NSJSONSerialization iOS 5.0, während es jetzt bei 520ms auf iOS 6.1 läuft. JSONKit hat ungefähr 524 ms gebraucht - und jetzt mit den gleichen Quellen - es dauert ungefähr 500 ms, letzteres allein wegen besserer Compiler.
Da ich neugierig war, sammelte ich einige Ergebnisse, kompiliert mit Xcode (bald verfügbar) und ein paar Screenshots von meiner gespaltenen Bonto-Benchmark.
Der Test beinhaltet meine eigene Parser-Bibliothek (JPJson) im Test mit dem Namen "JPJsonData" (die neueste Version, die noch nicht in GitHub eingecheckt ist), in einem fairen und vergleichbaren Test.Ich habe sichergestellt, dass JSONKit mit allen aktivierten Optimierungen kompiliert und Assertionen deaktiviert wurde, so dass es so schnell wie möglich ist.
Der Test auf dieser Hardware ausgeführt wurde, ein iPad 2 (die zweite Variante), mit diesen Spezifikationen:
System Name: iPhone OS Systemversion: 6.1.3 Modell: iPad Modell lokalisierte: iPad Plattform: iPad2,2 Hardware Modell: K94AP Plattform Typ: 14 Platform String: iPad 2G CPU-Frequenz: 475,113 MHz BUS Frequenz: 475,113 MHz Gesamtspeicher: 502 MByte User-Speicher: 419 MByte

Einige andere Test-Datei, so ziemlich durchschnittlich JSON:

JSON mit meist Zahlen:

JSON mit meist zufällig Unicode-Strings.
Diese JSON-Zeichenfolgen enthalten "Unicode noncharacters" und "Unicode NULL" Zeichen. JSONKit erlaubt diese Zeichen nicht - also ist fehlgeschlagen. JPJson wird sie standardmäßig nicht zulassen, aber es hat Optionen, die als Satz, diese Zeichen in JSON Strings erlauben:

aktualisieren
lief ich den Maßstab für ein iPhone 5s auf iOS 7, für 32-Bit und 64-Bit.
JSONKit konnte nicht für 64-Bit kompiliert werden.
System Name: iPhone OS
System Version: 7.0.4
Model: iPhone
Localized Model: iPhone
Platform: iPhone6,2
Hardware Model: N53AP
Platform Type: 18
Platform String: Unknown iPhone
CPU Frequency: 0 MHz
BUS Frequency: 0 MHz
Total Memory: 999 MByte
User Memory: 858 MByte
Alle Zeiten in Millisekunden.
-----------------------------------
twitter_timeline.json
| Library | 32-bit | 64-bit |
|---------------------|--------:|--------:|
| JSONKitData | 1.68 | *)|
| JPJsonData | 1.16 | 1.29 |
| NSJSONSerialization | 2.44 | 2.21 |
| SBJsonData | 6.05 | 6.69 |
-----------------------------------
appache_builds.json
| Library | 32-bit | 64-bit |
|---------------------|--------:|--------:|
| JSONKitData | 2.80 | *) |
| JPJsonData | 3.21 | 3.52 |
| NSJSONSerialization | 3.23 | 4.17 |
| SBJsonData | 10.41 | 11.75 |
-----------------------------------
mesh.json
| Library | 32-bit | 64-bit |
|---------------------|--------:|--------:|
| JSONKitData | 87.64 | *) |
| JPJsonData | 25.46 | 20.34 |
| NSJSONSerialization | 144.25 | 34.25 |
| SBJsonData | 105.60 | 107.70 |
-----------------------------------
sample.json
| Library | 32-bit | 64-bit |
|---------------------|--------:|--------:|
| JSONKitData | failed | *) |
| JPJsonData | 5.97 | 6.39 |
| NSJSONSerialization | 18.94 | 13.66 |
| SBJsonData | failed | 88.19 |
-----------------------------------
random.json
| Library | 32-bit | 64-bit |
|---------------------|--------:|--------:|
| JSONKitData | 23.01 | *) |
| JPJsonData | 17.69 | 20.62 |
| NSJSONSerialization | 28.83 | 28.60 |
| SBJsonData | 82.93 | 82.74 |
*) Failed to compile
Schön, diese Ergebnisse zu sehen, danke! Ich habe vorher JSONKit benutzt, bin aber zu 'NSJSONSerialization' gewechselt, weil es schnell war und mir eine andere externe Bibliothek erspart. Aber hä, was hättest du falsch machen können, wenn du grundsätzlich zwei Methodenaufrufe verglichen hast? –
Laufen Sie diese auf dem Simulator oder auf einem Gerät? –
Diese wurden auf dem iPhone 6.1 Simulator ausgeführt. –