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的幂:
Run Code Online (Sandbox Code Playgroud)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
Dar*_*ust 15
通过提供太大容量来浪费任何空间实际上是Apple故意不暴露的实现细节,我想.NSMutableArray是一个类集群,这意味着你实际上并没有获得NSMutableArray的实例,而是一些遵循相同接口的其他专用类.Apple并没有告诉你在哪种情况下返回哪个类以及它是如何表现的.所以很难在这里给出真正的建议.
如果你真的知道平均而言你需要X的容量,那就用吧.否则,除非你遇到性能问题,否则我根本不关心容量,只需使用[NSMutableArray array]......