NSMutableArray initWithCapacity细微差别

时间:2010-10-16 07:40:35

标签: cocoa performance nsmutablearray capacity

在指定容量时,是否有人建议如何最好地初始化NSMutableArray?该文档提到“......即使您在创建数组时指定了大小,指定的大小也被视为”提示“;数组的实际大小仍为0.”所以......

1)如果我的初始容量大于我通常使用的容量,我是否不必担心内存浪费?

2)如果我的初始容量通常低于我使用的容量,我是否需要担心更长的处理时间来分配更多的内存以容纳额外的元素?

此初始化容量对此数据类型的性能/内存使用有何影响?

2 个答案:

答案 0 :(得分:40)

Matt Gallagher 撰写了一篇关于Cocoa集合类的非常有用的文章,以及一些基准测试(带有& initWithCapacity:,以及跨类比较)

http://cocoawithlove.com/2008/08/nsarray-or-nsset-nsdictionary-or.html

他的长度为1,000,000 的NSMutableArray的测试(来源可用) 0.582256秒,无容量 0.572139sec,容量

Test                                       | Time
[NSMutableArray array]                     | 0.582256 seconds
[NSMutableArray arrayWithCapacity:1000000] | 0.572139 seconds
Iterating contents                         | 0.004713 seconds

我会说99%的用例[NSMutableArray array]就好了。但是,如果您确实知道结果数组的实际大小,那么使用[NSMutableArray arrayWithCapacity:]也不会有什么坏处。


然后是 Peter Ammon (他是Apple的AppKit / Foundation团队的开发人员)的这篇文章,其中包含几个富有洞察力的基准测试

http://ridiculousfish.com/blog/archives/2005/12/23/array/


编辑(2012年3月12日):

http://darkdust.net/writings/objective-c/nsarray-enumeration-performance

更深入了解数组初始化性能
  

[...]我[=> DarkDust]也想知道性能是否有所不同,具体取决于数组的创建方式。我测试了两种不同的方法:

     
      
  • 创建一个引用对象实例的C数组,并使用initWithObjects:count:创建数组。
  •   
  • 创建NSMutableArray,然后使用addObject:添加对象。
  •   
     

[...]分配时有所不同:initWithObjects:count: 方法更快。使用非常多的对象,这种差异可以变得显着


编辑(2014年3月6日):

进一步深入了解http://ciechanowski.me/blog/2014/03/05/exposing-nsmutablearray/的数组初始化性能:

  

让我们分配初始容量设置为连续2的幂的新数组:

for (int i = 0; i < 16; i++) {
    NSLog(@"%@", [[[NSMutableArray alloc] initWithCapacity:1 << i] explored_description]);
}
     

惊喜:

size:  2 // requested capacity:   1
size:  2 // requested capacity:   2
size:  4 // requested capacity:   4
size:  8 // requested capacity:   8
size: 16 // requested capacity:  16
size: 16 // requested capacity:  32
size: 16 // requested capacity:  64
size: 16 // requested capacity: 128
...
// 'size: 16' all the way down

答案 1 :(得分:15)

通过提供太大的容量来浪费任何空间实际上是Apple故意不暴露的实现细节,我想。 NSMutableArray是一个类集群,这意味着你实际上并没有获得NSMutableArray的实例,而是一些遵循相同接口的其他专用类。 Apple并没有告诉你在哪种情况下返回哪个类以及它是如何表现的。所以很难在这里给出真正的建议。

如果您确实知道平均而言需要 X 的容量,请使用它。否则,除非您遇到性能问题,否则我根本不关心容量,只需使用[NSMutableArray array] ...