在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++){}