美文网首页
数据遍历性能比较

数据遍历性能比较

作者: 十二月_9d09 | 来源:发表于2021-10-23 17:18 被阅读0次

    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 <Foundation/Foundation.h>
    
    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 表现中等,查询耗时相对稳定。

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

    相关文章

      网友评论

          本文标题:数据遍历性能比较

          本文链接:https://www.haomeiwen.com/subject/gmzraltx.html