Swift - 我应该创建字符串"count"的局部变量吗?



如果我在一个函数中多次使用字符串'count'有关系吗?也就是说,Swift 在第一次计算"计数"后会缓存它吗?下面是两个例子,我使用哪一个有关系吗?我认为第二个肯定没问题,但第一个呢?我一直看到像第一个这样的示例代码。

func Foo1 (str: String) {
...
// calling str.count twice
if x < str.count && y < str.count {
...
}
func Foo2 (str: String) {
...
// calling str.count once
let c = str.count
if x < c && y < c {
...
} 

.count由具有以下复杂性的Collection协议定义:

复杂度:O(1( 如果集合符合 RandomAccessCollection;否则为 O(n(,其中 n 是集合的长度。

String 不是 RandomAccessCollection。它是一个双向集合,所以它不承诺 O(1(。它只承诺 O(n(。

它绝对不承诺任何缓存(你不应该期望任何缓存(。

碰巧的是,在许多(可能是大多数(情况下,字符串的计数是缓存的。它是_StringObject的一部分,是低级存储抽象的一部分,通常由优化器内联。但这一切都没有承诺。

也就是说,除非你期望字符串非常大(至少10kB,可能更多(,否则很难想象这是一个主要的瓶颈,因为在紧密循环之外被调用两次。与大多数事情一样,您应该写清楚,然后进行剖析。为了清楚起见,我可能会创建一个额外的变量,但你不应该在这里猜测太多。写清楚。然后配置文件。

您是否正在使用特别大的字符串?

最新更新