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 }];
再者,项目中不会出现遍历这么多的数组元素,所以哪个适合自己就用哪个!
参考文档:原文