iOS 几种遍历方式

本文对比了多种iOS遍历方法的性能,包括经典for循环、NSFastEnumeration等,并针对不同数据规模给出了最佳实践建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值