在iOS 开发中遍历无处不在,当我们对iOS几种遍历不太了解时可能会影响你的应用的效率
下面我列出几种常用的遍历方式
经典 for 循环
for in (NSFastEnumeration)
KVC 集合运算符
enumerateObjectsUsingBlock
enumerateObjectsWithOptions(NSEnumerationConcurrent)
dispatch_apply
100对象遍历操作:
enumerateObjectsWithOptions(NSEnumerationConcurrent) - 0.001605
1000000对象遍历操作:
经典for循环 - 1.246721
for in (NSFastEnumeration) - 0.025955
makeObjectsPerformSelector - 0.068234
kvc集合运算符(@sum.number) - 21.677246
enumerateObjectsUsingBlock - 0.586034
enumerateObjectsWithOptions(NSEnumerationConcurrent) - 0.722548
dispatch_apply(Concurrent) - 0.607100
结论
-
对于集合中对象数很多的情况下,for in (NSFastEnumeration)的遍历速度非常之快,但小规模的遍历并不明显(还没普通for循环快)
-
使用kvc集合运算符运算很大规模的集合时,效率明显下降(100万的数组离谱的21秒多),同时占用了大量内存和cpu
-
enumerateObjectsWithOptions(NSEnumerationConcurrent)和dispatch_apply(Concurrent)的遍历执行可以利用到多核cpu的优势(实验中在双核cpu上效率基本上x2)
普通遍历 for (NSUInteger index = 0; index < array.count; index++){}