代码之家  ›  专栏  ›  技术社区  ›  Adam Eberbach Adil Shaikh

iPhone基金会:可变和XXXU容量的性能影响:0

  •  1
  • Adam Eberbach Adil Shaikh  · 技术社区  · 15 年前

    所有集合类都有两个版本-可变和不可变,例如nsarray和nsmutablearray。这种区别仅仅是为了通过提供const集合来促进谨慎的编程,还是在使用可变对象而不是不可变对象时会影响性能?

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

    2 回复  |  直到 14 年前
        1
  •  1
  •   Alex Reynolds    15 年前

    提前创建一个具有足够对象容量的集合有什么性能优势吗?

    如果您提前为可变数组预留空间,那么在添加对象时就不会有调整空数组或小数组大小的开销。调整大小可能需要将对象保持在适当的位置,在堆上设置足够大的新空间块,然后可能将这些对象移动到内存中的新位置。

    但是,如果预先指定所需的空间,则不需要处理此大小调整。你有那么大的空间,你可以把物体放进去。

        2
  •  1
  •   Laurent Etiemble    15 年前

    有什么性能优势吗 创建具有容量的集合 提前准备足够的物品?

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

    通常使用“initWithCapacity:”当您大致知道要放入数组的元素数时。主要优点是存储分配只进行一次,并避免不必要的大小调整。

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

    如果不是,为什么函数 像是+(id)emptyarray?

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

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