我想知道这是否会对性能或内存消耗产生很大影响。我需要一个NSMutableArray,一开始我只能猜测要添加多少个对象。大约3到5个人。所以我这样创建它:
NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:3];例如,当创建容量为3而不是50时,这里到底会发生什么?在知道至少有20个元素的情况下,创建容量为1的它是不是一个坏主意?或者,这还不够让人头疼吗?我的应用程序中有大约10个这样的数组,它们都必须在开始时加载。
发布于 2009-08-20 21:20:32
initWithCapacity将导致NSMutableArray为该数量的元素预先分配空间。
将更多数据推送到超出该容量的NSMutableArray中将导致NSMutableArray重新分配其底层内存。这种重新分配还需要将整个数组从旧的(较小的)分配复制到新的(较大的)分配。因此,将这个数字设置得太小会造成性能损失,但不会太大。
指定一个大于实际使用量的容量会浪费内存,因为会有内存分配给永远不会使用的项目。
我的建议是,如果您知道数组的大小通常不会超过N项,请调用initWithCapacity:N。偶尔出现大于N的NSMutableArray的性能损失是可以接受的,而且您不必为那些没有超过该限制的数组付出代价。
发布于 2009-08-20 21:15:35
这没什么大不了的,除非你说的是极端的重复或者巨大的数组。除非它成为真正的瓶颈,否则不值得尝试优化。
编辑:我想引用Donald Knuth的话:
过早优化是万恶之源。
发布于 2009-08-20 21:16:33
有理论上的答案和实际的答案。从理论上讲,设置更大的容量可能会改变数组的分配和存储策略(尽管在内部称为"NSArray“,但结构要比这复杂一点)。
从实际的角度来看,数组将根据需要重新分配,对于您所讨论的数字,我怀疑是否会有任何区别。如果我知道我会把成千上万的东西放进去,我可能会做一个arrayWithCapacity。3对50基本上是没有意义的。
从我的角度来看,"withCapacity“最好的用处就是提供一个明显的钩子来挂起您的假设,这样您就可以(例如)拥有代码中的文档,这些文档是您以后可能想要断言的。但这绝对不是必需的。
从实践的角度来看,最好的利用你的时间是甚至不去想这个问题。
https://stackoverflow.com/questions/1308849
复制相似问题