興味深いことに、JSON パーサーのパフォーマンスを気にする人がまだいます ;)
約 3 年前、私は独自の JSON パーサーを開発しました。その目標は、高速でメモリ フットプリントが少ないことです。それ以来、他のもの、特に NSJSONSerialization と JSONKit との比較に興味がありました。新しいコンパイラと OS がパーサーをどのように改善したかを確認するために、ときどき実行するベンチマークがいくつかあります。また、Bonto のベンチをフォークし、いくつかのエラーを修正し、いくつかの異常な JSON ファイルを追加し、独自のパーサーも追加しました。
ここ数年で、 のパフォーマンスがNSJSONSerialization
大幅に向上したことを確認できます。現在、多くの作業負荷で JSONKit に匹敵します。私の記憶が正しければ、あるテストでは NSJSONSerialization iOS 5.0 で 690 ミリ秒かかりましたが、iOS 6.1 では現在 520 ミリ秒で実行されています。JSONKit は約 524 ミリ秒かかりましたが、現在は同じソースを使用していますが、約 500 ミリ秒かかります。後者は、コンパイラが優れているためです。
興味があったので、いくつかの結果を集め、Xcode (近日公開予定) でコンパイルし、分岐した Bonto のベンチマークからいくつかのスクリーンショットを取得しました。
テストには、公平で比較可能なテストで、「JPJsonData」という名前のテストに独自のパーサー ライブラリ (JPJson) (まだ GitHub にチェックインされていない最新バージョン) が含まれています。JSONKit は、可能な限り高速になるように、すべての最適化を有効にしてアサーションを無効にしてコンパイルされていることを確認しました。
テストは、次の仕様の iPad 2 (2 番目のバリアント) であるこのハードウェアで実行されました。
システム名: iPhone OS システム バージョン: 6.1.3 モデル: iPad ローカライズ モデル: iPad プラットフォーム: iPad2、2 ハードウェア モデル: K94AP プラットフォーム タイプ: 14 プラットフォーム文字列: iPad 2G CPU 周波数: 475.113 MHz バス周波数: 475.113 MHz 合計メモリ: 502メガバイト ユーザー メモリ: 419 メガバイト
他のテスト ファイル、ほぼ平均的な JSON:
ほとんどが数値の JSON:
ほとんどがランダムな Unicode 文字列を含む JSON。
これらの JSON 文字列には、「Unicode 非文字」および「Unicode NULL」文字が含まれています。JSONKit はこれらの文字を許可していないため、失敗します。JPJson はデフォルトでは許可しませんが、設定すると JSON 文字列でこれらの文字を許可するオプションがあります。
アップデート
32 ビットと 64 ビットの両方について、iOS 7 で iPhone 5s のベンチマークを実行しました。
JSONKit は 64 ビット用にコンパイルできませんでした。
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
ミリ秒単位のすべてのタイミング。
-----------------------------------
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