博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OC各种遍历方法的效率比较
阅读量:4694 次
发布时间:2019-06-09

本文共 2660 字,大约阅读时间需要 8 分钟。

看了一篇博客,挺有意思,OC各种遍历方法的效率,打算自己也测试一番。看看,究竟哪一个的效率更好一些!

准备工作:懒加载一个数组,创建一千万个对象添加到数组。

1 #pragma mark - Lazy Methods 2 - (NSMutableArray *)objArray { 3     if (!_objArray) { 4         _objArray = [NSMutableArray array]; 5         for (int i = 0; i < 10000000; i ++) { 6             [_objArray addObject:[[NSObject alloc] init]]; 7         } 8     } 9     return _objArray;10 }

 

1.测试普通 for 循环

1 #pragma mark - 测试普通 for 循环2 - (void)testCommonForCycle {3     NSMutableArray *tempArray = [NSMutableArray array];4     NSLog(@"Beign");5     for (int i = 0; i < self.objArray.count; i ++) {6         [tempArray addObject:self.objArray[i]];7     }8     NSLog(@"End");9 }

控制台输出:

1 2016-03-16 16:59:33.301 OC各种遍历方法的效率比较[5462:405485] Beign2 2016-03-16 16:59:40.985 OC各种遍历方法的效率比较[5462:405485] End

我晕,我这里耗时相差了 7.684s

 

2.测试 for-in

1 #pragma mark - 测试 for-in 2 - (void)testForInCycle {3     NSMutableArray *tempArray = [NSMutableArray array];4     NSLog(@"Beign");5     for (NSObject *obj in self.objArray) {6         [tempArray addObject:obj];7     }8     NSLog(@"End");9 }

控制台输出:

1 2016-03-16 17:06:35.303 OC各种遍历方法的效率比较[5477:410562] Beign2 2016-03-16 17:06:40.789 OC各种遍历方法的效率比较[5477:410562] End

耗时相差了 5.486s。 Time(for-in) < Time(for)

 

3.测试Block块

1 #pragma mark - 测试Block2 - (void)testBlock {3     NSMutableArray *tempArray = [NSMutableArray array];4     NSLog(@"Beign");5     [self.objArray enumerateObjectsUsingBlock:^(NSObject *obj, NSUInteger idx, BOOL * _Nonnull stop) {6         [tempArray addObject:obj];7     }];8     NSLog(@"End");9 }

控制台输出:

1 2016-03-16 17:10:28.941 OC各种遍历方法的效率比较[5543:414507] Beign2 2016-03-16 17:10:36.603 OC各种遍历方法的效率比较[5543:414507] End

耗时相差了 7.662s。Time(for-in) < Time(block) < Time(for)

 

4.测试 枚举器

1 #pragma mark - 测试 枚举器 2 - (void)testEnumerator { 3     NSMutableArray *tempArray = [NSMutableArray array]; 4     NSLog(@"Beign"); 5     NSEnumerator *enumerator = [self.objArray objectEnumerator]; 6     while (enumerator.nextObject) { 7         [tempArray addObject:enumerator.nextObject]; 8     } 9     NSLog(@"End");10 }

控制台输出:

1 2016-03-16 17:16:31.255 OC各种遍历方法的效率比较[5565:418958] Beign2 2016-03-16 17:16:37.447 OC各种遍历方法的效率比较[5565:418958] End

耗时相差了 6.192s。

粗略的得出的结论(不精确的):Time(for-in) < Time(enumerator) < Time(block) < Time(for)

虽然粗略的看出 Block块循环耗时较高,但是我们可以看到Block块的优势:

  • 简化的代码
  • 可控性强
1 NSArray *array = @[@"1", @"2", @"3", @"4"];2     [array enumerateObjectsUsingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) {3         if ([obj isEqualToString:@"2"]) {4             *stop = YES;5         }6         NSLog(@"obj=%@, idx=%lu", obj, idx);7     }];

再者,项目中不会出现遍历这么多的数组元素,所以哪个适合自己就用哪个!

参考文档:

转载于:https://www.cnblogs.com/xiu619544553/p/5284329.html

你可能感兴趣的文章
Js中的window.parent ,window.top,window.self 详解
查看>>
next
查看>>
数据库---表---多表查询
查看>>
【分享】常用获取IP及地区信息API
查看>>
Spring 【引用】类型【注入】
查看>>
正则表达式 环视
查看>>
关于Tchar
查看>>
小白学习Spark系列三:RDD常用方法总结
查看>>
将jquery序列化转成对象的编码坑
查看>>
jsoi r2d1t3的50分
查看>>
解决使用jedis连接是报DENIED Redis is running in protected mode错误
查看>>
嵌套循环注意事项
查看>>
[bzoj 3732] Network (Kruskal重构树)
查看>>
ajax学习(一)
查看>>
vmx转换ofv模板,导入esxi
查看>>
grafana-----Annotation
查看>>
delphi------项目类型
查看>>
JQUERY几个操作action,随意记录
查看>>
求所有子数组的和的最大值
查看>>
springMVC
查看>>