OCの種々の遍歴法の効率比較

12222 ワード

ブログを見て、とてもおもしろくて、OCのいろいろな遍歴方法の効率、自分でもテストするつもりです.どれが効率的なのか見てみましょう.
準備作業:配列をリロードし、1千万個のオブジェクトを配列に追加します.
 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.684 sです
 
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.486 sだった.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.662 sだった.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.192 sだった.
大まかな結論(不正確):Time(for-in)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     }];

    また、プロジェクトにはこんなに多くの配列要素が遍歴することはありませんので、どれが自分に合っているかはどれを使います!
    参考文献:原文