我处于一种情况,我需要获取数组中的项目,时间是敏感的。我可以选择使用单独的变量来保存当前计数,或者只使用NSMutableArray的计数方法。
例如:if (myArray.count == ... )
或if (myArrayCount == ...)
从数组的count方法计算项目的数量有多贵?
答案 0 :(得分:4)
正确的答案是,速度没有区别,所以你希望我的孩子访问数组的计数:)
答案 1 :(得分:3)
获取NSArray
' count
方法并不比获取已存储此值的局部变量更昂贵。它被调用时不会被计算出来。它是在创建和存储数组时计算的。
对于NSMutableArray
,唯一的区别是每次修改数组内容时都会重新计算属性。最终结果仍然相同 - 当您致电count
时,返回的数字是预先计算的。它只是返回已存储的预先计算的数字。
将变量存储在变量中,尤其是NSMutableArray
变量实际上是一个更糟糕的选择,因为数组的大小可能会发生变化,并且访问此变量中的计数并不会更快。它只会增加潜在不准确的风险。
向自己证明这是在调用count
方法时未计算的预设值的最佳方法是创建两个数组。一个数组只有几个元素。另一个阵列有数万个元素。现在计算count
返回需要多长时间。无论数组的大小如何,您都会发现count
返回的时间是相同的。
答案 2 :(得分:2)
作为对上述所有人的更正,NSArray没有计数属性。它有一个计数方法。该方法本身要么物理地计算数组中的所有元素,要么是数组存储的私有变量的getter。除非你计划继承NSArray并创建一个更高效的系统来计算动态和/或静态数组...你不会比在NSArray上使用count方法获得更好的性能。事实上,你应该依靠Apple已经优化了这种方法的事实。我的主要思考是,如果你正在进行异步调用并且你的重点是优化NSArray的数量,你怎么不知道你是在认真做错了什么。如果你在主线程上执行一些高性能的击球方法......你应该考虑优化它。使用NSArray计数方法迭代和计算数组的性能不会影响您的性能到任何明显的速率。
如果这对您来说真的是一个问题,您应该阅读更多有关NSArrays和NSMutableArrays的性能的信息。你可以从这里开始:link
答案 3 :(得分:0)
如果您需要获取项目** s **,那么获取计数不时间至关重要。您还需要查看快速枚举,或使用带调度块的枚举,尤其是并行执行。
答案 4 :(得分:0)
编辑:
Asa是最正确的答案。我误解了这个问题。
Asa是对的,因为编译器会自动优化它并自行使用最快的方式。
TheGamingArt关于NSArray尽可能优化是正确的。但是,这仅适用于obj-c。
不要忘记你可以访问c和c ++,这意味着你可以使用只能轻微地使用的向量。考虑到它不会使用obj-c消息传递更快。但是,如果差异不明显,我不会感到惊讶。 c ++矢量基准:http://baptiste-wicht.com/posts/2012/12/cpp-benchmark-vector-list-deque.html
这是过早优化的一个很好的例子(http://c2.com/cgi/wiki?PrematureOptimization)。我建议你研究一下GCD或NSOperations(http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues)