如果我创建一个容量= 3而不是容量= 50的NSMutableArray,这有多重要?

10 arrays iphone cocoa-touch uikit

我想知道这是否会影响性能或内存消耗.我需要一个NSMutableArray,并且在开始时我只能猜测将添加多少个对象.大概3到5个.所以我这样创建它:

NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:3];
Run Code Online (Sandbox Code Playgroud)

例如,当创建容量为3而不是50时,这里会发生什么?当知道至少有20个元素时,创建容量为1是不是一个坏主意?或者这不足以让人头疼吗?我在我的应用程序中有10个这样的数组,他们都必须在开始时加载.

fbr*_*eto 8

initWithCapacity将导致NSMutableArray为该数量的元素预分配空间.

将更多数据推送到NSMutableArray超出该容量的范围将导致NSMutableArray重新分配其底层内存.这种重新分配还需要将整个阵列从旧(较小)分配复制到新(较大)分配.因此,对于使这个数字太小而存在性能损失,但不是很多.

指定一个大于实际使用容量的容量会浪费内存,因为将为永远不会使用的项目分配内存.

我的建议是,如果您知道阵列的大小通常不会超过N个项目,请致电initWithCapacity:N.偶尔NSMutableArray大于N 的性能损失是可以接受的,并且对于那些没有超过该限制的阵列,您将不必为此付出代价.

  • 尽管如此,我认为这个答案是不正确的.尽管在某些情况下容量用于提示,但创建容量为千兆字节的可变数组并不会立即分配一千兆字节的内存.如果您不相信我,请亲自尝试.NSMutableArray*bigArray = [[NSMutableArray alloc] initWithCapacity:1024*1024*1024]; if(!bigArray){NSLog(@"数组未创建!"); } else {NSLog(@"是的,它被创建了."); 如果您实际填充此数组,您将看到内存使用量增加.不是之前. (2认同)

Tho*_*ith 6

除非你谈论极端重复或巨大阵列,否则这不是什么大问题.除非它成为真正的瓶颈,否则不值得尝试进行优化.

编辑:我想添加唐纳德克努特的一句话:

过早优化是万恶之源.

  • 这意味着:除非你a)确实需要它更快地运行并且b)识别慢速部分,否则不要优化代码的性能.否则,您只需使代码更复杂,增加复杂性并花费时间就没有任何好处. (2认同)