ZippyJSON
ZippyJSON是JSONDecoder的一个更快的版本
基准测试
这些基准测试是在Macbook Pro上执行的。在iPhone上的结果也非常相似(ZippyJSON在这三个平台上的所有三个文件上都要快3倍以上)。
用法
只需将您想要使用的地方的JSONDecoder
替换为ZippyJSONDecoder
。所以,而不是let decoder = JSONDecoder()
,您需要做的是let decoder = ZippyJSONDecoder()
,然后一切都会正常工作。这是因为ZippyJSONDecoder
有与JSONDecoder
完全相同的API(即它是直接替代品)。另外,别忘了在您使用的地方的文件中添加import ZippyJSON
。
为什么这么快?
- 苹果的版本首先使用
NSJSONSerialization
将JSON转换为NSDictionary
,然后将事物变得Swifty。这个中间字典的创建代价很高。 - ZippyJSON主要由C++构建(但仍然有一个Swift接口包围)。对于初始解析(你可以称之为标记化),它使用simdjson,一个非常快速的库,充分利用了向量化。另一方面,苹果完全使用Swift(除了使用
NSJSONSerialization
),这通常要慢一些。 - 此外,还有一些具体的优化。例如,使用JJLISO8601DateFormatter进行ISO-8601日期解析比使用苹果的日期格式化器快10倍。
所以,这主要归功于苹果试图表现得优雅并操作在更高的层次。
何时使用这个库?
首先,默认使用JSONDecoder
。它经过了大量的实战测试,对于许多用例来说已经足够好。然后,一旦你开始在寻找新的优化项,看看你的JSON解析需要多长时间。毕竟,JSON解析可以是获取数据到用户的一个瓶颈。作为一般原则,将当前花费的时间除以4来估算使用ZippyJSON的时间。如果这个差异对你来说意义重大(即使是毫秒也可以影响用户体验!),那么考虑使用ZippyJSON。
未来的改进
代码中仍有许多地方可以优化。如果你有特定的需要在更多高效的JSON解析,而ZippyJSON已经比苹果的快4倍,请随时提交一个工单。对于JSONEncoder和NSJSONSerialization的优化也很有前途,如果你需要这些中的一个得到改进,请提出。
安装
Cocoapods
ZippyJSON可通过CocoaPods(SWPM支持正在开发中)获取。要安装它,只需将以下行添加到您的Podfile中
pod 'ZippyJSON'
如果希望抑制所有警告,可以这样做:pod 'ZippyJSON', :inhibit_warnings => true
。
SwiftPM(仅限iOS)
使用存储库URLhttps://github.com/michaeleisel/ZippyJSON在SwiftPM包区域添加该包
作者
Michael Eisel,[email protected]