JSONKit基准

我从http://www.bonto.ch/blog/2011/12/08/json-libraries-for-ios-comparison-updated/中提取了代码,并在本地机器上testing了它。

我对结果感到惊讶, NSJSonSerializationJSONKit有更好的性能。

NSJSonSerialization在速度上真的超越了JSONKit吗?还是我做错了什么?

twitter_timeline_json.png

twitter_timeline.json

repeat_json.png

repeat.json

random_json.png

random.json

你没有做错什么。

事情已经改变了iOS 6.苹果已经大大提高了NSJSONSerialization的性能。 使用iOS 6或更高版本时,速度最快。

JSONKit也没有在一年内更新。 它落后了。

有趣的是,仍然有人关心JSONparsing器的性能;)

大约三年前,我开发了自己的JSONparsing器,目标是使其速度更快,并具有较低的内存占用量。 从那以后,我感兴趣的是如何与其他人比较,特别是NSJSONSerialization和JSONKit。 我有一些偶尔运行的基准testing,以检查新的编译器和操作系统是如何改进parsing器的。 我还分叉了Bonto的板凳,修复了一些错误,添加了一些病态的JSON文件,并添加了我自己的parsing器。

那么我可以肯定,在过去的几年中, NSJSONSerialization的性能得到了很大的提升。 现在可以与JSONKit进行很多工作负载了。 如果我没有记错的话,那么对于NSJSONSerialization iOS 5.0来说,某个testing需要690ms,而现在它在iOS 6.1上以520ms的速度执行。 JSONKit花了大约524ms – 现在有相同的来源 – 大约需要500ms,后者完全是由于更好的编译器。

由于我很好奇,我收集了一些结果,用Xcode编译(很快可用)以及从我的分叉Bonto的基准testing中截取的一些截图。

testing在testing中包含了我自己的parsing器库(JPJson),名称为“JPJsonData”(尚未签入GitHub的最新版本),并进行了公平和可比较的testing。 我保证,JSONKit已经在所有优化启用的情况下被编译,并禁用了断言,所以尽可能快。

testing已经在这个硬件上运行,一个iPad 2(第二个变种),这些规格:

系统名称:iPhone OS系统版本:6.1.3型号:iPad本地化型号:iPad平台:iPad2,2硬件型号:K94AP平台types:14平台string:iPad 2G CPU频率:475.113MHz总线频率:475.113MHz总内存:502 MByte用户内存:419 MByte

在这里输入图像说明


其他一些testing文件,几乎平均JSON:

在这里输入图像说明


主要是数字的JSON:

在这里输入图像说明


JSON主要是随机的Unicodestring。

这些JSONstring包含“Unicode非字符”和“Unicode空白”字符。 JSONKit不允许这些字符 – 因此失败。 JPJson默认不会允许它们,但是它有一些选项,当设置的时候,允许JSONstring中的那些字符:

在这里输入图像说明


更新

我在iOS 7上运行了iPhone 5s的基准testing,分别是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 

我在iPhone 4(ios7)和iPhone 4S(ios 6.1)上运行testing,NSJSONSerialization在这两种情况下都更快。

在这里输入图像说明

在这里输入图像说明