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     }];

再者,項目中不會出現遍歷這么多的數組元素,所以哪個適合自己就用哪個!

參考文檔:原文


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM