如何使用{array | dictionary} WithCapacity?

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

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

所以如果这些方法真的有帮助,我应该使用像这样的东西:

  *withCapacity:maxNumberOfElements * 1.5 

代替

 *withCapacity:maxNumberOfElements 

所以对于我的物体来说,它的容量已经足够多了,而且当我把所有的物体放进去的时候,它们不会扩大。

当您计划使用大量元素填充集合,或者知道要加载的元素的确切数量时,这非常有用。 调整一个集合的大小需要CPU周期,所以不必要的调整最终意味着减less设备在电池上运行的时间。

考虑一下这个例子:假设你将加载3000个元素到一个数组中。 如果您为默认数组分配了16个项目的空间,那么在达到保存3000个元素所需的大小之前,数组需要重新resize八次。 在初始位置复制的元素需要在每次调整数组大小时进行复制,从而产生3000多个额外的复制操作。 当您知道元素的确切数量时,您可以防止发生复制。

另外,你的数组不会浪费你不想添加的元素的内存:如果你逐个添加3000个元素,那么数组可能增长到4000内部, 过去的1000个元素将被浪费。

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

从性能的angular度来看它是有用的。 当容量经常扩大时,会在内存中分配一个新的数组(通常是当前容量的两倍),并将旧的数组复制到新的数组中。 随着#元素数量的增加,这会开始变得昂贵,所以如果你有大容量的数组(大致)事先已知的话,build议使用initWithCapacity。 另一方面,如果你分配的东西比需要的大得多,那么你正在浪费空间,所以标准的“谨慎使用”警告就适用了。

实际上,除非你创build了大量的数组/字典(与呈现UI页面的频率相比),否则使用...WithCapacity将不会有可衡量的性能...WithCapacity 。 即使这样,除非你有至less有几百个条目的数组/字典,否则没有必要担心这个问题。

就多大的尺寸而言,在最终尺寸上可能有一点(5-10%)是理想的,但部分取决于是否容易受到存储限制。

如果您确切地知道有多less条目,则指定确切数量(如果您指定了任何内容)。