關于oc中遍歷的效率算法研究

關于oc中遍歷的效率算法研究

在oc中,編寫程序最常用的的算法莫過于對算法的遍歷,下面我們來探索一下最常用的幾種算法的效率。

  • for(int i = 0; ; )

  • for in

  • enumerateObjectsUsingBlock

  • dispatch_apply

  • NSPredicate


for(int i = 0; ; )

-(void)test {
    for (int i = 0 ; i < self.arrData.count ; i ++) {
       PersonModel *model = self.arrData[i];
        NSLog(@"==========%@",model.name);
        
    }
}

for in

    int i = 0 ;
    for ( PersonModel * model in self.arrData) {
        i++;
         NSLog(@"==========%@",model.name);
    }

enumerateObjectsUsingBlock

-(void)test2 {
    [self.arrData enumerateObjectsUsingBlock:^(PersonModel* model, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"==========%@",model.name);
    }];
}

dispatch_apply

-(void)test3 {
    
    dispatch_apply(self.arrData.count, dispatch_get_global_queue(0, 0), ^(size_t i) {
           PersonModel *model = self.arrData[i];
         NSLog(@"==========%@",model.name);
    });
}

NSPredicate

-(void)test4 {
    NSPredicate*predicate = [NSPredicate predicateWithFormat:@"name == 'sws1000'"];
    NSMutableArray*arr = [self.arrData mutableCopy];
    [arr filterUsingPredicate:predicate];
    PersonModel*model = self.arrData[0];
    NSLog(@"===============%@",model.name);
}

調用方法

- (IBAction)startBtn:(UIButton *)sender {
    uint64_t begin = mach_absolute_time();
    switch (self.type) {
            case 0:
            [self test ];
            break;
            case 1:
            [self test1 ];
            break;
            case 2:
            [self test2 ];
            break;
            case 3:
            [self test3 ];
            break;
            case 4:
            [self test4 ];
            break;
            
        default:
            break;
    }
    uint64_t end = mach_absolute_time();
    _timeLabel.text = [NSString stringWithFormat:@"用時%.9fs",pow(10,-9)*(end - begin)];
}

結論

我們分別對大小為10000和100000的數據進行遍歷,發現,for(int i = 0; ; )耗時分別為:3.479707737s和29.039399192s;for in耗時分別為:3.409268507s和16.015781127;enumerateObjectsUsingBlock耗時分別為:3.423908732s和23.985882636s;dispatch_apply耗時分別為:1.958693214s和14.826218417s;NSPredicate耗時分別為:0.006494015s和0.046621182s。
從而得出結論,當數組很小時,并且數組存儲的對象類型進行過濾操作時,NSPredicate的效率超乎想象的高,其次是在處理比較耗時的操作時gcd的多線程處理效果更高,其次是for in的處理方式。

點擊鏈接進入觀看完整代碼。具體請參考: https://github.com/tianjifou/SWSErgodicArrayTest.git;(轉載請說明出處,謝謝!)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容