我从中提取代码 http://www.bonto.ch/blog/2011/12/08/json-libraries-for-ios-comparison-updated/并在我的本地计算机上对其进行了测试。
我对结果感到惊讶, NSJSonSerialization 提供了比 JSONKit 更好的性能。
NSJSonSerialization在速度方面是否真的超过了JSONKit,还是我做错了什么?
twitter_timeline.json
repeat.json
random.json
答案 0 :(得分:7)
你没有做错任何事。
iOS 6中的情况发生了变化.Apple大大提高了NSJSONSerialization
的性能。使用iOS 6及更高版本时,它是最快的。
JSONKit也未在一年内更新。它落后了。
答案 1 :(得分:4)
有趣的是,仍然有人关心JSON解析器性能;)
大约三年前,我开发了自己的JSON解析器,其目标是使其快速且内存占用率低。从那时起,我对它与其他人的比较感兴趣,尤其是NSJSONSerialization和JSONKit。我偶尔会运行一些基准测试,以检查新的编译器和操作系统如何改进解析器。我还分叉了Bonto的工作台,修复了一些错误,添加了一些病态的JSON文件并添加了我自己的解析器。
嗯,我可以确认,在过去几年中,NSJSONSerialization
的表现得到了很大改善。对于许多工作负载,它现在可与JSONKit相媲美。如果我没记错的话,NSJSONSerialization iOS 5.0的测试花了690ms,而现在iOS 6.1的测试时间为520ms。 JSONKit花了大约524ms - 现在使用相同的源 - 它需要大约500ms,后者仅仅是因为更好的编译器。
由于我很好奇,我收集了一些结果,使用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 MByte 用户记忆:419 MByte
其他一些测试文件,几乎是普通的JSON:
主要是数字的JSON:
JSON主要是随机Unicode字符串。
这些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
答案 2 :(得分:2)
我在iPhone 4(ios7)和iPhone 4S(ios 6.1)上运行测试,两种情况下NSJSONSerialization都更快。