马特·加拉格尔写了一篇关于 Cocoa 集合类的信息非常丰富的文章,以及一些基准(有和没有initWithCapacity:
,以及跨类比较)
http://cocoawithlove.com/2008/08/nsarray-or-nsset-nsdictionary-or.html http://cocoawithlove.com/2008/08/nsarray-or-nsset-nsdictionary-or.html
他对 NSMutableArray 的测试(来源可用)长度 1,000,000 took 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:]
either.
然后还有这篇文章彼得·阿蒙(谁是一个Apple AppKit/Foundation 团队的开发人员)具有一些有见地的基准:
http://ridiculousfish.com/blog/archives/2005/12/23/array/ http://ridiculousfish.com/blog/archives/2005/12/23/array/
编辑(2012 年 3 月 12 日):
有关数组初始化性能的更多见解,请参阅http://darkdust.net/writings/objective-c/nsarray-enumeration-performance 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/exusing-nsmutablearray/ 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