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

原文地址:https://www.cnblogs.com/someonelikeyou/p/5201487.html