【问题标题】:JSONKit benchmarksJSONKit 基准测试
【发布时间】:2013-04-19 13:46:21
【问题描述】:

我从 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

【问题讨论】:

  • 很高兴看到这些结果,谢谢!我之前使用过 JSONKit,但后来改用 NSJSONSerialization,因为它速度很快,并且为我节省了另一个外部库。但是,嘿,基本上比较两个方法调用,你做错了什么?
  • 你是在模拟器上还是在设备上运行这些?
  • 这些是在 iPhone 6.1 模拟器上运行的。
  • 有人可以备份吗?这另有说明,但从 2011 年开始 (github.com/johnezang/…) ...
  • 您应该确保在构建设置中禁用了断言,这会使 JSONKit 慢得多。

标签: ios jsonkit


【解决方案1】:

有趣的是,仍然有人关心 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

【讨论】:

  • @PsychoDad 是的,比光还快——不,这仅仅意味着 JSON Kit 遇到了错误。 ;) 细节:JSONKit 不允许 Unicode NULL 字符和 Unicode 非字符。通常,它们不会出现在合理的 JSON 中,但严格来说是允许的。 “sample.json”包含随机创建的 JSON,因此偶尔会出现创建 Unicode 非字符的情况。
  • 你在 iPhone 5/5S 或 iPad 4 / iPad Air 上测试过吗?
  • 设备类型在答案中给出。未在最新硬件上进行测试,但相对数字应该大致相同。
  • @croyneaus4u 我已经更新了运行 iOS 7 的 iPhone 5s 的基准测试结果。
【解决方案2】:

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

【讨论】:

  • 为了进行公平比较,您需要确保使用正确的构建设置进行编译,从而禁用 NSAssert 宏:在“预处理器宏”中定义 NDEBUGNS_BLOCK_ASSERTIONS。此外,您需要比较“JSONKitData”测试,否则,您将向 JSONKit 提供需要先转换为 NSData 的“NSString”。
【解决方案3】:

你没有做错任何事。

iOS 6 中的情况发生了变化。Apple 大大提高了NSJSONSerialization 的性能。使用 iOS 6 及更高版本时,速度最快。

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

【讨论】:

  • +1: "JSONKit 也一年没有更新了。"是的,看来 JSONKit 回购已经死了......:/
猜你喜欢
  • 2010-12-30
  • 1970-01-01
  • 2017-05-29
  • 2014-07-30
  • 2014-05-14
  • 2023-04-03
  • 2012-05-14
  • 1970-01-01
相关资源
最近更新 更多