有趣的是,仍然有人关心 JSON 解析器的性能 ;)
大约三年前,我开发了自己的 JSON 解析器,目标是使其速度快且内存占用少。从那时起,我对它与其他的比较感兴趣,尤其是 NSJSONSerialization 和 JSONKit。我确实有一些我偶尔运行的基准测试,以检查新的编译器和操作系统如何改进解析器。我还分叉了 Bonto 的工作台,修复了一些错误,添加了一些病态 JSON 文件并添加了我自己的解析器。
嗯,我可以确认,在过去几年中,NSJSONSerialization 的性能有了很大的提高。现在,它在许多工作负载上都可以与 JSONKit 相媲美。如果我没记错的话,NSJSONSerialization iOS 5.0 的某个测试需要 690 毫秒,而现在它在 iOS 6.1 上的执行时间为 520 毫秒。 JSONKit 花了大约 524 毫秒 - 现在使用相同的源 - 大约需要 500 毫秒,后者完全是由于更好的编译器。
由于我很好奇,我收集了一些结果,用 Xcode(很快可用)编译,并从我的分叉 Bonto 的基准上截取了一些屏幕截图。
测试中包含我自己的解析器库 (JPJson),名称为“JPJsonData”(尚未签入 GitHub 的最新版本),这是一个公平且可比较的测试。我确保,JSONKit 已在启用所有优化和禁用断言的情况下进行编译,以便它尽可能快。
测试已在此硬件上运行,iPad 2(第二个变体),具有以下规格:
系统名称:iPhone OS
系统版本:6.1.3
型号:iPad
本地化机型:iPad
平台:iPad2,2
硬件型号:K94AP
平台类型:14
平台字符串:iPad 2G
CPU频率:475.113 MHz
总线频率:475.113 MHz
总内存:502 MB
用户内存:419 MByte
其他一些测试文件,几乎是普通的 JSON:
大部分是数字的 JSON:
带有大部分随机 Unicode 字符串的 JSON。
这些 JSON 字符串确实包含“Unicode 非字符”和“Unicode NULL”字符。 JSONKit 不允许这些字符 - 因此是失败的。 JPJson 默认情况下不允许它们,但它有一些选项,当设置时,允许 JSON 字符串中的这些字符:
更新
我在 iOS 7 上为 iPhone 5s 运行了 32 位和 64 位的基准测试。
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