所有集合类都有两个版本 - 可变和不可变,例如NSArray和NSMutableArray。区别仅仅是通过提供const集合来促进仔细编程,还是在使用可变对象而不是不可变对象时会有一些性能损失?
类似地,每个集合类都有一个方法xxxxWithCapacity,就像
[NSMutableArray arrayWithCapacity:0]
。我经常使用零作为参数,因为它似乎是错误地猜测可能添加多少个对象的更好选择。是否有一些性能优势来提前创建具有足够对象容量的集合?如果没有,为什么功能不像+ (id)emptyArray
?
答案 0 :(得分:1)
预先创建具有足够容量的容量的集合是否有一些性能优势?
如果提前为可变数组保留空间,则在添加对象时不需要调整空数组或小数组的大小。调整大小可能涉及将对象保持在原位,在堆上设置足够大的新空间块,然后可能将这些对象移动到内存中的新位置。
然而,如果您事先指定了所需的空间,则不需要调整此大小。你有那么大的空间,你可以把对象放在那里。
答案 1 :(得分:1)
是否有一些性能优势 创建一个容量集合 预先提供足够的物品?
向NSMutableArray添加元素时,阵列可能必须调整其存储区域的大小才能适应插入。通常,数组使用特定的算法以平衡的方式增长;增长足以支持一些插入,但不能太多以避免浪费记忆。
当您大致知道要放入阵列的元素数量时,通常会使用“initWithCapacity:”。主要优点是存储分配完成一次,避免不必要的调整大小。
此存储大小调整可能会影响性能(因为它意味着存储区域的扩展),但您应该根据需要进行微基准测试。
如果不是为什么不是这个功能 类似+(id)emptyArray?
您不需要+ (id)emptyArray
,因为有+ (id)array
:
NSMutableArray *array = [NSMutableArray array];
[array addObject:[NSString string]];
[array removeAllObjects];