OC各种遍历方法的效率比较

看了一篇博客,挺有意思,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] Beign
2 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] Beign
2 2016-03-16 17:06:40.789 OC各种遍历方法的效率比较[5477:410562] End

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

 

3.测试Block块

1 #pragma mark - 测试Block
2 - (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] Beign
2 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] Beign
2 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     }];

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

参考文档:原文

posted @ 2016-03-16 17:20  Kingdev  阅读(2937)  评论(0编辑  收藏  举报