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
});
});


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页