数据遍历性能比较

1、For In循环
这也是最常用的一个方法。如果需要知道数组下标,用普通的For循环比较方便。
2、利用enumerateObjectsUsingBlock进行遍历
这种遍历方法代码整合度比较高,用enumerateObjectsWithOptions方法,可以对数组进行倒叙和逆序遍历,比较灵活。另外,使用这个方法对字典的遍历比较方便。
3、NSPredicate 谓词查询
NSPredicate 有些类似SQLite数据库查询,支持模糊搜索,多条件搜索等功能。但不支持调整遍历顺序(正序还是逆序)。
4、dispatch_apply 遍历
该方法利用GCD开启多条线程,并发处理任务,所以执行效率高,但不支持调整遍历顺序。

//
//  main.m
//  TestProject2
//
//  Created by liben on 2021/10/23.
//

#import 

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSMutableArray* arr = [NSMutableArray new];
        for(int i=1;i<100000;i++){
            [arr addObject:[NSString stringWithFormat:@"%d",i]];
        }
        NSPredicate* predicate = [NSPredicate predicateWithFormat:@"SELF == %@",@"50000"];
        NSTimeInterval start1 = CFAbsoluteTimeGetCurrent();
        NSArray* arrFilter = [arr filteredArrayUsingPredicate:predicate];
        NSTimeInterval interval1 = CFAbsoluteTimeGetCurrent() - start1;
        NSLog(@"interval1:%f",interval1);
        NSTimeInterval start2 = CFAbsoluteTimeGetCurrent();
        for(NSString* s in arr){
            if([s isEqualToString:@"50000"]){
                NSTimeInterval iterval2 = CFAbsoluteTimeGetCurrent() - start2;
                NSLog(@"interval2:%f",iterval2);
            }
        }
        //迭代器
        NSTimeInterval start3 = CFAbsoluteTimeGetCurrent();
        [arr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            NSString* s = obj;
            if([s isEqualToString:@"50000"]){
                NSTimeInterval interval3 = CFAbsoluteTimeGetCurrent() - start3;
                NSLog(@"interval3:%f",interval3);
                *stop = YES;
                return;
            }
        }];
        
    }
    return 0;
}
console:
2021-10-24 17:11:30.870836+0800 TestProject2[53802:6311998] interval1:0.027634
2021-10-24 17:11:30.877110+0800 TestProject2[53802:6311998] interval2:0.003602
2021-10-24 17:11:30.889720+0800 TestProject2[53802:6311998] interval3:0.007895

注:经过毫秒耗时检测,发现在数组个数小于1000,差别不是很明显。但当数组个数较大,ForIN的速度是最快的,其次是GCD。NSPredicate 表现的最慢。enumerateObjectsUsingBlock 表现中等,查询耗时相对稳定。

综上所述,一般正常开发中,大可根据需求选择对应的遍历方法。但如果是大量数据,就要结合需求和性能,选择一个比较合适的方法了。

你可能感兴趣的:(数据遍历性能比较)