JJLISO8601DateFormatter
JJLISO8601DateFormatter
是一个线程安全的、功能完备的、易于替换 NSISO8601DateFormatter
的方案,对于日期的转换速度提升 10 倍或更多。
- 日期转换为字符串:速度快达 12x+
- 字符串转换为日期:速度快达 10x
- 对象创建:速度快达 10x
关于如何进行基准测试的更多信息请见这里。
使用方法
由于它直接替换,您只需将 NSISO8601DateFormatter
替换为 JJLISO8601DateFormatter
并包含相应的头文件 #import <JJLISODateFormatter/JJLISODateFormatter.h>
。
需求
- iOS 10.0+
- MacOS 10.13+
安装
Cocoapods
JJLISO8601DateFormatter 可以通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile 中:
pod 'JJLISO8601DateFormatter'
FAQ
这个日期格式化库是如何保持与时区变化的同步的?
它使用系统提供的时区文件,和 POSIX 函数如 localtime
使用的相同文件。如果找不到它们,它将回退到使用 Apple 的日期格式化库。
为什么它这么快?
库没有什么特别之处。它用简单的 C 语言编写,并尽可能地避免不必要的分配、锁定等操作。它使用从 tzdb
程序集获取的 mktime
和 localtime
版本。更好的问题是,为什么 Apple 的这么慢?Apple 的日期格式化类基于 ICU,这是一个虽然可靠但相当慢的库。很难一眼看出具体原因,但它似乎有很多额外的抽象、不必要的复制等,总体上并不优先考虑性能。
日期格式化很困难。这个库是如何确保正确性的?
尽管日期格式化很困难,但这个库有广泛的单元测试,涵盖了以下边缘情况:
- 所有不同的格式选项
- 所有不同的时区
- 闰秒(我们或 Apple 都没有实际处理它们)
- 闰日
- 并发使用
由于对于ISO 8601标准,我们只需要支持公历,所以事情也变得更简单。
对于所有东西来说都是这样吗?
对于一些不合理的格式选项(比如只有周数但没有年份)和格式不正确的日期字符串,行为有点不同。但总的来说,它们是相同的。如果你发现不同,请随时提交工单。
为什么前缀是"JJL"呢?
因为用左手小指按键时很容易输入。
还有其他适合优化的Apple库吗?
是的,很多,问题是哪一些值得优化。如果你需要针对某些导致性能问题的库进行优化,可以提出请求。
基准测试是如何进行的?
它通过查看许多日期字符串到字符串以及字符串到日期的转换来进行,时间范围从现在之前的15天到之后的15天,从1970年到现在,三个时区,以及格式选项NSISO8601DateFormatOptionsWithInternetDateTime | NSISO8601DateFormatWithFractionalSeconds
。基准测试代码位于示例项目的-viewDidLoad
方法中,位于视图控制器中,你可以通过运行该项目来获得令人满意的基准测试输出。我通常在我的iPhone 8上进行测试,偶尔在其他设备上进行双重检查。显然,数字可能会变化。
未来的改进和贡献
贡献者始终欢迎。以下是一些可能的改进
- 没有Objective-C代码的Swift版本库
- 全面重构 NSDateFormatter(可行,但划算吗?)
- 返回
char *
而不是NSString
类型的方法,用于将日期转换为字符串。 - 支持 watchOS 和 tvOS
作者
Michael Eisel,[email protected]
许可证
JJLISO8601DateFormatter 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。