Swift - 我应该创建字符串的局部变量 "count" 吗?
Swift - should I create local variable of a strings "count"?
如果我在一个函数中多次使用一个字符串 'count' 有什么关系吗?也就是说,Swift 是否在首次计算后缓存 'count'。下面是两个例子,我用哪一个有关系吗?我认为第二个肯定没问题,但第一个呢?我一直看到第一个这样的示例代码。
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
协议定义,具有以下复杂性:
Complexity: O(1) if the collection conforms to RandomAccessCollection; otherwise, O(n), where n is the length of the collection.
String 不是 RandomAccessCollection。它是一个 BidirectionalCollection,因此它不承诺 O(1)。它只承诺 O(n)。
它绝对不承诺任何缓存(你不应该期望任何缓存)。
碰巧在许多(可能是大多数)情况下,String 的计数被缓存了。它是 _StringObject
的一部分,它是低级存储抽象的一部分,并且通常由优化器内联。但是 none 这是承诺的。
就是说,除非您期望字符串非常大(至少 10kB,可能更大),否则很难想象这是一个主要瓶颈,因为它在紧密循环之外被调用了两次。与大多数事情一样,您应该先写清楚,然后再介绍。为了清楚起见,我可能会创建一个额外的变量,但你不应该在这里过分猜测。写清楚。然后简介.
您正在使用特别大的字符串吗?
如果我在一个函数中多次使用一个字符串 'count' 有什么关系吗?也就是说,Swift 是否在首次计算后缓存 'count'。下面是两个例子,我用哪一个有关系吗?我认为第二个肯定没问题,但第一个呢?我一直看到第一个这样的示例代码。
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
协议定义,具有以下复杂性:
Complexity: O(1) if the collection conforms to RandomAccessCollection; otherwise, O(n), where n is the length of the collection.
String 不是 RandomAccessCollection。它是一个 BidirectionalCollection,因此它不承诺 O(1)。它只承诺 O(n)。
它绝对不承诺任何缓存(你不应该期望任何缓存)。
碰巧在许多(可能是大多数)情况下,String 的计数被缓存了。它是 _StringObject
的一部分,它是低级存储抽象的一部分,并且通常由优化器内联。但是 none 这是承诺的。
就是说,除非您期望字符串非常大(至少 10kB,可能更大),否则很难想象这是一个主要瓶颈,因为它在紧密循环之外被调用了两次。与大多数事情一样,您应该先写清楚,然后再介绍。为了清楚起见,我可能会创建一个额外的变量,但你不应该在这里过分猜测。写清楚。然后简介.
您正在使用特别大的字符串吗?