關于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;(轉載請說明出處,謝謝!)