1

当我使用NSMutableArrayorNSMutableDictionary时,如果我知道要放入的元素数或最大元素数,我通常使用arrayWithCapacityor创建它们dictionaryWithCapacity,但我想知道为数组/字典指定(初始)容量是否真的有帮助?

我不知道它是如何在内部实现的,但我相信当集合中的元素数量达到容量甚至接近容量时,集合可能会扩展其容量,所以如果我创建了一个可变数组容量32,只要我把第32个物体放进去,它就会自己膨胀到另一个容量?或者即使我把第30个物体放进去,它的容量也会扩大,因为它认为会有更多的物体?

因此,如果这些方法真的有帮助,我应该使用类似的方法:

 *withCapacity:maxNumberOfElements * 1.5

代替

*withCapacity:maxNumberOfElements

所以它对我的对象有足够的容量并且当我放入所有对象时不会扩展?

4

3 回答 3

0

从性能的角度来看,它很有用。当容量经常扩展时,会在内存中分配一个新数组(通常是当前数组容量的 2 倍),并将旧数组复制到新数组中。随着元素数量的增加,这可能会开始变得昂贵,因此如果您有容量(大致)预先知道的大型数组,建议使用 initWithCapacity。另一方面,如果你分配的东西比需要的大得多,你就是在浪费空间,所以标准的“谨慎使用”警告适用。

于 2012-08-20T00:59:33.833 回答
0

实际上,除非您创建大量数组/字典(与呈现 UI 页面的频率相比),否则使用...WithCapacity. 即使那样,也没有必要担心它,除非你有至少有几百个条目的数组/字典。

就要估计的大小而言,可能比最终大小稍微(5-10%)是理想的,但这部分取决于您是否容易受到存储限制。

但是,如果您确切知道有多少条目,请指定确切的数量(如果您指定了任何内容)。

于 2012-08-20T01:09:49.820 回答
0

当您计划使用大量元素填充集合时,或者当您知道要加载的元素的确切数量时,这很有用。调整集合的大小需要 CPU 周期,因此不必要地调整大小最终会转化为减少设备使用电池运行的时间。

考虑这个例子:假设你要加载 3000 个元素到一个数组中。如果您为默认数组分配空间,例如 16 个项目,则该数组需要调整 8 次才能达到容纳 3000 个元素所需的大小。每次调整数组大小时,都需要复制在初始位置复制的元素,从而导致 3000+ 次额外的复制操作。当您知道元素的确切数量时,您可以防止复制发生。

此外,您的数组不会为您不打算添加的元素浪费内存:如果您逐个添加 3000 个元素,则数组可能会在内部增长到 4000 个,以期待更多的元素;最后 1000 个元素将被浪费。

总而言之,当您确定确切的目标大小时,您应该使用容量初始化集合。当您从文件或网络连接反序列化数据时,经常会出现这种情况。在您不知道大小的情况下,最好不要猜测,让默认初始化顺其自然。

于 2012-08-20T01:21:54.220 回答