繁体   English   中英

NSArray计数方法有多贵?

[英]How expensive is the NSArray count method?

我处于一种情况,我需要获取数组中的项目,时间是敏感的。 我可以选择使用单独的变量来保存当前计数,或者只使用NSMutableArray的count方法。

例如: if (myArray.count == ... )if (myArrayCount == ...)

从数组的count方法计算项目的数量是多少?

正确的答案是,速度没有区别,所以你希望我的孩子访问数组的计数:)

获取NSArraycount方法并不比获取存储此值的局部变量更昂贵。 它被调用时不计算。 它是在创建和存储数组时计算的。

对于NSMutableArray ,唯一的区别是NSMutableArray修改数组内容时都会重新计算属性。 最终结果仍然相同 - 当您调用count ,返回的数字是预先计算的。 它只是返回已存储的预先计算的数字。

将计数存储在变量中,特别是对于NSMutableArray实际上是一个更糟糕的选择,因为数组的大小可能会改变,并且访问此变量中的计数并不是更快。 它只会增加潜在不准确的风险。

向自己证明这是在调用count方法时不计算的预设值的最佳方法是创建两个数组。 一个数组只有几个元素。 另一个阵列有数万个元素。 现在count返回需要多长时间。 无论数组的大小如何,您都会发现返回count的时间是相同的。

作为对上述每个人的修正,NSArray没有计数属性。 它有一个计数方法。 该方法本身要么物理地计算数组中的所有元素,要么是数组存储的私有变量的getter。 除非你计划继承NSArray并创建一个更高效的系统来计算动态和/或静态数组......你不会比在NSArray上使用count方法获得更好的性能。 事实上,你应该依靠Apple已经优化了这种方法的事实。 我的主要思考是,如果你正在进行异步调用并且你的重点是优化NSArray的数量,你怎么不知道你是在认真做错了什么。 如果你在主线程上执行一些高性能的击球方法......你应该考虑优化它。 使用NSArray的计数方法迭代和计算数组的性能不会影响您的性能到任何明显的速率。

如果这对您来说真的是一个问题,您应该阅读更多有关NSArrays和NSMutableArrays的性能的信息。 你可以从这里开始: 链接

如果您需要获得项目** s **,那么获得计数并不是时间关键。 您还需要查看快速枚举,或使用带调度块的枚举,尤其是并行执行。

编辑:

Asa是最正确的答案。 我误解了这个问题。

Asa是对的,因为编译器会自动优化它并自己使用最快的方法。


关于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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM