iPhone Foundation - mutable和xxxWithCapacity的性能影响:0

时间:2010-05-05 00:08:13

标签: iphone cocoa-touch

所有集合类都有两个版本 - 可变和不可变,例如NSArray和NSMutableArray。区别仅仅是通过提供const集合来促进仔细编程,还是在使用可变对象而不是不可变对象时会有一些性能损失?

类似地,每个集合类都有一个方法xxxxWithCapacity,就像 [NSMutableArray arrayWithCapacity:0]。我经常使用零作为参数,因为它似乎是错误地猜测可能添加多少个对象的更好选择。是否有一些性能优势来提前创建具有足够对象容量的集合?如果没有,为什么功能不像+ (id)emptyArray

2 个答案:

答案 0 :(得分:1)

预先创建具有足够容量的容量的集合是否有一些性能优势?

如果提前为可变数组保留空间,则在添加对象时不需要调整空数组或小数组的大小。调整大小可能涉及将对象保持在原位,在堆上设置足够大的新空间块,然后可能将这些对象移动到内存中的新位置。

然而,如果您事先指定了所需的空间,则不需要调整此大小。你有那么大的空间,你可以把对象放在那里。

答案 1 :(得分:1)

  

是否有一些性能优势   创建一个容量集合   预先提供足够的物品?

NSMutableArray添加元素时,阵列可能必须调整其存储区域的大小才能适应插入。通常,数组使用特定的算法以平衡的方式增长;增长足以支持一些插入,但不能太多以避免浪费记忆。

当您大致知道要放入阵列的元素数量时,通常会使用“initWithCapacity:”。主要优点是存储分配完成一次,避免不必要的调整大小。

此存储大小调整可能会影响性能(因为它意味着存储区域的扩展),但您应该根据需要进行微基准测试。

  

如果不是为什么不是这个功能   类似+(id)emptyArray?

您不需要+ (id)emptyArray,因为有+ (id)array

NSMutableArray *array = [NSMutableArray array];
[array addObject:[NSString string]];
[array removeAllObjects];