• iOS 快速遍历 效率分析 for loop for in enumerateBlock 适用条件


    test1

    简单遍历
    结论:
    当数组数据量很小 时候 for loop 和 for in 效率不相上下,随着数据量增长for in 快速枚举的优势 明显 如果需要知道 索引可用 enumrateBlock

    test2

    根据value 查找对应index   例如 查找9999999对应索引
    结论: 数据量小  for in 最好 enumerateBlock稍弱 但可读性更强 enumerateObjectsWithOptions最弱
    数据量大  enumerateObjectsWithOptions最好 其次 enumerateBlock 最差 for in
    NSMutableArray *test = [NSMutableArray array];

    test3

    for in  enumerateObjectsWithOptions:遍历字典
    结论 遍历字典 用 enumerateKeysAndObjectsUsingBlock 速度快 代码可读性强

    注意要点:

        NSEnumerationConcurrent

        枚举过程中,(那么底层通过GCD来处理并发执行事宜,具体实现可能会用到dispatch group。也就是说,这个会用多线程来并发实现)各个Block是同时开始执行的。这样枚举的完成顺序是不确定的。 

       也就是说由于并发处理, 没法同步获取结果(适合 针对里面元素的处理,不能用作 "遍历"加和)

        NSEnumerationReverse

        以反序方式枚举

    - (void)test1
    {//简单遍历
        //结论:
        //当数组数据量很小 时候 for loop 和 for in 效率不相上下,随着数据量增长for in 快速枚举的优势 明显 如果需要知道 索引可用 enumrateBlock
        NSMutableArray *test = [NSMutableArray array];
        for (int i = 0; i < 100000; i ++) {
            [test addObject:@(i)];
        }
        
        //for loop
        __block int sum = 0;
        double date_s = CFAbsoluteTimeGetCurrent();
        for (int i = 0; i < test.count; i ++) {
            sum += [test[i] integerValue];
        }
        double date_current = CFAbsoluteTimeGetCurrent() - date_s;
        NSLog(@"Sum : %d ForLoop Time: %f ms",sum,date_current * 1000);
        
        //for in
        sum = 0;
        date_s = CFAbsoluteTimeGetCurrent();
        for (NSNumber *num in test) {
            sum += [num integerValue];
        }
        date_current = CFAbsoluteTimeGetCurrent() - date_s;
        NSLog(@"Sum : %d For-in Time: %f ms",sum,date_current * 1000);
        
        // enumberateObjectes
        sum = 0;
        date_s = CFAbsoluteTimeGetCurrent();
        [test enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            sum += [obj integerValue];
        }];
        date_current = CFAbsoluteTimeGetCurrent() - date_s;
        NSLog(@"Sum : %d enumrateBlock Time: %f ms",sum,date_current * 1000);
        
        
        sum = 0;
        date_s = CFAbsoluteTimeGetCurrent();
        [test enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            sum += [obj integerValue];
        }];
        date_current = CFAbsoluteTimeGetCurrent() - date_s;
        NSLog(@"Sum : %d enumrateBlock Time: %f ms",sum,date_current * 1000);
        
        //    结果:
        //    2016-02-19 11:57:40.561 TableViewDemo[9988:1598542] Sum : 1783293664 ForLoop Time: 41.271031 ms
        //    2016-02-19 11:57:40.578 TableViewDemo[9988:1598542] Sum : 1783293664 For-in Time: 17.231047 ms
        //    2016-02-19 11:57:40.630 TableViewDemo[9988:1598542] Sum : 1783293664 enumrateBlock Time: 51.365972 ms
    }
    
    - (void)test2
    {//根据value 查找对应index   例如 查找9999999对应索引
        //结论: 数据量小  for in 最好 enumerateBlock稍弱 但可读性更强 enumerateObjectsWithOptions最弱
        //     数据量大  enumerateObjectsWithOptions最好 其次 enumerateBlock 最差 for in
        NSMutableArray *test = [NSMutableArray array];
        for (int i = 0; i < 10; i ++) {
            [test addObject:@(i + 10)];
        }
        
        //For-in
        __block NSInteger index = 0;
        double date_s = CFAbsoluteTimeGetCurrent();
        for (NSNumber *num in test) {
            if ([num integerValue] == 9999999) {
                index = [test indexOfObject:num];
                break;
            }
        }
        double date_current = CFAbsoluteTimeGetCurrent() - date_s;
        NSLog(@"index : %ld For-in Time: %f ms",(long)index,date_current * 1000);
        
        //enumerateObjectsUsingBlock
        index = 0;
        date_s = CFAbsoluteTimeGetCurrent();
        [test enumerateObjectsUsingBlock:^(id num, NSUInteger idx, BOOL *stop) {
            if ([num integerValue] == 9999999) {
                index = idx;
                *stop = YES;
            }
        }];
        date_current = CFAbsoluteTimeGetCurrent() - date_s;
        NSLog(@"index : %ld enumerateBlock Time: %f ms",(long)index,date_current * 1000);
        
        //enumerateObjectsWithOptions
        index = 0;
        date_s = CFAbsoluteTimeGetCurrent();
        [test enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id num, NSUInteger idx, BOOL *stop) {
            if ([num integerValue] == 9999999) {
                index = idx;
                *stop = YES;
            }
        }];
        date_current = CFAbsoluteTimeGetCurrent() - date_s;
        NSLog(@"index : %ld enumerateObjectsWithOptions Time: %f ms",(long)index,date_current * 1000);
        
        
    //    2016-02-19 16:00:54.799 TableViewDemo[11084:1707298] index : 9999989 For-in Time: 754.406035 ms
    //    2016-02-19 16:00:55.384 TableViewDemo[11084:1707298] index : 9999989 enumerateBlock Time: 585.359991 ms
    //    2016-02-19 16:00:55.806 TableViewDemo[11084:1707298] index : 9999989 enumerateObjectsWithOptions Time: 420.368969 ms
    }
    
    - (void)test3
    {//for in  enumerateObjectsWithOptions:遍历字典
        //结论 遍历字典 用 enumerateKeysAndObjectsUsingBlock 速度快 代码可读性强
        NSDictionary *testDictionary = @{
                                         @"Auther" : @"南望青天",
                                         @"Game" : @"Dota",
                                         @"App" : @"麦刀塔",
                                         @"Market" : @"AppStore"
                                         };
        
        //For - in
        NSMutableArray *forInArry = [NSMutableArray array];
        double date_s = CFAbsoluteTimeGetCurrent();
        NSArray *keys = [testDictionary  allKeys];
        for (NSString *key in keys) {
            NSString *Value = testDictionary[key];
            [forInArry addObject:Value];
        }
        double date_current = CFAbsoluteTimeGetCurrent() - date_s;
        NSLog(@"index : %ld For-in Time: %f ms",(long)index,date_current * 1000);
        
        //enumerateKeysAndObjectsUsingBlock
        date_s = CFAbsoluteTimeGetCurrent();
        NSMutableArray *enumArry = [NSMutableArray array];
        [testDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
            [enumArry addObject:obj];
        }];
        date_current = CFAbsoluteTimeGetCurrent() - date_s;
        NSLog(@"index : %ld Dic Time: %f ms",(long)index,date_current * 1000);
        
        NSLog(@"ForInArr: %@",forInArry);
        NSLog(@"enumArry: %@",enumArry);
    //    2016-02-19 16:26:35.307 TableViewDemo[11268:1721020] index : 4516026384 For-in Time: 0.015974 ms
    //    2016-02-19 16:26:35.308 TableViewDemo[11268:1721020] index : 4516026384 Dic enumerateKeysAndObjectsUsingBlock Time: 0.006974 ms
    }

     参考博客 http://www.jianshu.com/p/ef3f1731a353

  • 相关阅读:
    Freemarker中JS取Data-model的值的问题
    Jquery动态添加元素并给元素增加onchange相应
    [算法] 动态规划
    Linux安装mysql.8.0.12
    Linux命令
    [算法] 并查集
    Flume整合Kafka完成实时数据采集
    Kafka 单节点部署
    Spark Streaming——Flume实例
    Spark实战——日志分析
  • 原文地址:https://www.cnblogs.com/someonelikeyou/p/5201487.html
Copyright © 2020-2023  润新知