iOS 幾種遍歷方式

在iOS 開發中遍歷無處不在,當我們對iOS幾種遍歷不太瞭解時可能會影響你的應用的效率

下面我列出幾種常用的遍歷方式

經典 for 循環

for in (NSFastEnumeration

KVC 集合運算符 

enumerateObjectsUsingBlock

enumerateObjectsWithOptions(NSEnumerationConcurrent) 

dispatch_apply


100對象遍歷操作:
for 一般循環 ---0.0023

makeObjectsPerformSelector - 0.001120

kvc集合運算符(@sum.number) - 0.004272

enumerateObjectsUsingBlock - 0.001145

enumerateObjectsWithOptions(NSEnumerationConcurrent) - 0.001605

這樣並不能看出什麼結論,當數據多時達到1000000時就會有很大差距了

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++){}
for in
for (NSString *string in array) { //do }

makeObjectsPerformSelector:
[array makeObjectsPerformSelector:@selector(dosomethins)]
enumerateObjectsUsingBlock, enumerateObjectsWithOptions:
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
}]
dispatch_apply(Concurrent)
功能:把一項任務提交到隊列中多次執行,具體是並行執行還是串行執行由隊列本身決定.注意,dispatch_apply不會立刻返回,在執行完畢後纔會返回,是同步的調用。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_apply([array count], dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index {
//do some things
});
});


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章