NSMutableArray initWithCapacity细微差别

Joe*_*oey 26 performance cocoa capacity nsmutablearray

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

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

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

这个初始化容量对这种数据类型的性能/内存使用有多大影响?

Reg*_*ent 41

Matt Gallagher撰写了一篇关于Cocoa集合类的文章,以及几个基准测试(有和没有initWithCapacity:,以及跨类比较)

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

他对长度为1,000,000的NSMutableArray的测试(源可用)在没有容量的情况下花费了0.582256秒,在容量上花费了0.572139秒.

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了解阵列初始化性能

[...] I [=> 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]);
}
Run Code Online (Sandbox Code Playgroud)

惊喜惊喜:

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


Dar*_*ust 15

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

如果你真的知道平均而言你需要X的容量,那就用吧.否则,除非你遇到性能问题,否则我根本不关心容量,只需使用[NSMutableArray array]......

  • 您不能总是使用非可变数组,因为要添加的对象并不总是事先知道.例如,假设您要将数字1 ... x添加到数组中,但_x_是一个参数,因此不知道:您必须在循环中添加数字.当然,你_can_也使用了一个C数组和` - [NSArray initWithObjects:count:]`但是大多数时候这样做太多了. (2认同)