iOS 快速遍历 效率分析 for loop for in enumerateBlock 适用条件
test1
简单遍历
结论:
当数组数据量很小 时候 for loop 和 for in 效率不相上下,随着数据量增长for in 快速枚举的优势 明显 如果需要知道 索引可用 enumrateBlock
test2
根据value 查找对应index 例如 查找9999999对应索引 结论: 数据量小 for in 最好 enumerateBlock稍弱 但可读性更强 enumerateObjectsWithOptions最弱 数据量大 enumerateObjectsWithOptions最好 其次 enumerateBlock 最差 for in NSMutableArray *test = [NSMutableArray array];
test3
for in enumerateObjectsWithOptions:遍历字典 结论 遍历字典 用 enumerateKeysAndObjectsUsingBlock 速度快 代码可读性强
注意要点:
NSEnumerationConcurrent
枚举过程中,(那么底层通过GCD来处理并发执行事宜,具体实现可能会用到dispatch group。也就是说,这个会用多线程来并发实现)各个Block是同时开始执行的。这样枚举的完成顺序是不确定的。
也就是说由于并发处理, 没法同步获取结果(适合 针对里面元素的处理,不能用作 "遍历"加和)
NSEnumerationReverse
以反序方式枚举。
- (void)test1 {//简单遍历 //结论: //当数组数据量很小 时候 for loop 和 for in 效率不相上下,随着数据量增长for in 快速枚举的优势 明显 如果需要知道 索引可用 enumrateBlock NSMutableArray *test = [NSMutableArray array]; for (int i = 0; i < 100000; i ++) { [test addObject:@(i)]; } //for loop __block int sum = 0; double date_s = CFAbsoluteTimeGetCurrent(); for (int i = 0; i < test.count; i ++) { sum += [test[i] integerValue]; } double date_current = CFAbsoluteTimeGetCurrent() - date_s; NSLog(@"Sum : %d ForLoop Time: %f ms",sum,date_current * 1000); //for in sum = 0; date_s = CFAbsoluteTimeGetCurrent(); for (NSNumber *num in test) { sum += [num integerValue]; } date_current = CFAbsoluteTimeGetCurrent() - date_s; NSLog(@"Sum : %d For-in Time: %f ms",sum,date_current * 1000); // enumberateObjectes sum = 0; date_s = CFAbsoluteTimeGetCurrent(); [test enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { sum += [obj integerValue]; }]; date_current = CFAbsoluteTimeGetCurrent() - date_s; NSLog(@"Sum : %d enumrateBlock Time: %f ms",sum,date_current * 1000); sum = 0; date_s = CFAbsoluteTimeGetCurrent(); [test enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { sum += [obj integerValue]; }]; date_current = CFAbsoluteTimeGetCurrent() - date_s; NSLog(@"Sum : %d enumrateBlock Time: %f ms",sum,date_current * 1000); // 结果: // 2016-02-19 11:57:40.561 TableViewDemo[9988:1598542] Sum : 1783293664 ForLoop Time: 41.271031 ms // 2016-02-19 11:57:40.578 TableViewDemo[9988:1598542] Sum : 1783293664 For-in Time: 17.231047 ms // 2016-02-19 11:57:40.630 TableViewDemo[9988:1598542] Sum : 1783293664 enumrateBlock Time: 51.365972 ms } - (void)test2 {//根据value 查找对应index 例如 查找9999999对应索引 //结论: 数据量小 for in 最好 enumerateBlock稍弱 但可读性更强 enumerateObjectsWithOptions最弱 // 数据量大 enumerateObjectsWithOptions最好 其次 enumerateBlock 最差 for in NSMutableArray *test = [NSMutableArray array]; for (int i = 0; i < 10; i ++) { [test addObject:@(i + 10)]; } //For-in __block NSInteger index = 0; double date_s = CFAbsoluteTimeGetCurrent(); for (NSNumber *num in test) { if ([num integerValue] == 9999999) { index = [test indexOfObject:num]; break; } } double date_current = CFAbsoluteTimeGetCurrent() - date_s; NSLog(@"index : %ld For-in Time: %f ms",(long)index,date_current * 1000); //enumerateObjectsUsingBlock index = 0; date_s = CFAbsoluteTimeGetCurrent(); [test enumerateObjectsUsingBlock:^(id num, NSUInteger idx, BOOL *stop) { if ([num integerValue] == 9999999) { index = idx; *stop = YES; } }]; date_current = CFAbsoluteTimeGetCurrent() - date_s; NSLog(@"index : %ld enumerateBlock Time: %f ms",(long)index,date_current * 1000); //enumerateObjectsWithOptions index = 0; date_s = CFAbsoluteTimeGetCurrent(); [test enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id num, NSUInteger idx, BOOL *stop) { if ([num integerValue] == 9999999) { index = idx; *stop = YES; } }]; date_current = CFAbsoluteTimeGetCurrent() - date_s; NSLog(@"index : %ld enumerateObjectsWithOptions Time: %f ms",(long)index,date_current * 1000); // 2016-02-19 16:00:54.799 TableViewDemo[11084:1707298] index : 9999989 For-in Time: 754.406035 ms // 2016-02-19 16:00:55.384 TableViewDemo[11084:1707298] index : 9999989 enumerateBlock Time: 585.359991 ms // 2016-02-19 16:00:55.806 TableViewDemo[11084:1707298] index : 9999989 enumerateObjectsWithOptions Time: 420.368969 ms } - (void)test3 {//for in enumerateObjectsWithOptions:遍历字典 //结论 遍历字典 用 enumerateKeysAndObjectsUsingBlock 速度快 代码可读性强 NSDictionary *testDictionary = @{ @"Auther" : @"南望青天", @"Game" : @"Dota", @"App" : @"麦刀塔", @"Market" : @"AppStore" }; //For - in NSMutableArray *forInArry = [NSMutableArray array]; double date_s = CFAbsoluteTimeGetCurrent(); NSArray *keys = [testDictionary allKeys]; for (NSString *key in keys) { NSString *Value = testDictionary[key]; [forInArry addObject:Value]; } double date_current = CFAbsoluteTimeGetCurrent() - date_s; NSLog(@"index : %ld For-in Time: %f ms",(long)index,date_current * 1000); //enumerateKeysAndObjectsUsingBlock date_s = CFAbsoluteTimeGetCurrent(); NSMutableArray *enumArry = [NSMutableArray array]; [testDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { [enumArry addObject:obj]; }]; date_current = CFAbsoluteTimeGetCurrent() - date_s; NSLog(@"index : %ld Dic Time: %f ms",(long)index,date_current * 1000); NSLog(@"ForInArr: %@",forInArry); NSLog(@"enumArry: %@",enumArry); // 2016-02-19 16:26:35.307 TableViewDemo[11268:1721020] index : 4516026384 For-in Time: 0.015974 ms // 2016-02-19 16:26:35.308 TableViewDemo[11268:1721020] index : 4516026384 Dic enumerateKeysAndObjectsUsingBlock Time: 0.006974 ms }
参考博客 http://www.jianshu.com/p/ef3f1731a353
posted on 2016-02-19 16:37 ACM_Someone like you 阅读(2006) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
2013-02-19 uva 1160 - X-Plosives