看了一篇博客,挺有意思,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 }];
再者,項目中不會出現遍歷這么多的數組元素,所以哪個適合自己就用哪個!
參考文檔:原文