ZippyFormat
[NSString stringWithFormat:] 的更快版本
基准测试
这些基准测试是在 iPhone XS 上进行的。Mac 上的结果非常相似。注意,在某些情况下(位置参数、%S
、%C
、输入格式错误),ZippyFormat 会回退到调用 Apple 的版本。然而,这些情况在典型用法中似乎非常罕见(例如,带有位置参数的本地化字符串通常使用 NSLocalizedString
)。更多信息,请参阅 此处。
用法
只需在文件顶部添加 #import <ZippyFormat/ZippyFormat.h>
,然后在您想使用的地方将 [NSString stringWithFormat:...]
替换为 [ZIPStringFormat stringWithFormat:...]
。
为什么它会这么快?
- "NSString"通过 category 名为 "NSMutableString"(或者至少是它的 CoreFoundation 相关版本)创建字符串,而 ZippyFormat 则直接向一个
char *
缓冲区中追加,并在最后才创建一个 "NSString"。- 在某个程度上,ZippyFormat 可以使用栈上的
char *
,避免了 "NSMutableString" 会做的中间堆空间的分配,因为 "NSMutableString" 总是准备在其初始作用域之外使用。 - 将格式化的参数追加到
char *
中而不进行验证,因为它已经知道数据是有效的 UTF-8)。相比之下,"NSMutableString" 的方法为其他用例而通用,并且对传入的字节数少的假设更少。这意味着额外的非必要验证。
- 在某个程度上,ZippyFormat 可以使用栈上的
- 对于
%@
参数,"NSString" 仅仅是追加[object description]
。然而,传递给调试语句的对象通常只由一些类(如 "NSNumber"、"NSDictionary"、"NSArray" 等)之一组成。对于这些情况,ZippyFormat 会“内联”追加描述,通过将已知的输出复制到缓冲区,而不会调用[object description]
。
所以这很大程度上是因为苹果试图做到优雅和在更高层次上操作。
安装
CocoaPods
ZippyFormat 可以通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile 中。
pod 'ZippyFormat'
手工方式
ZippyFormat 只包含几个文件,没有嵌套的导入结构,所以只需复制文件即可。
作者
迈克·埃塞尔,[email protected]