美文网首页
关于oc中遍历的效率算法研究

关于oc中遍历的效率算法研究

作者: 天机否 | 来源:发表于2017-01-10 11:35 被阅读151次

关于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;(转载请说明出处,谢谢!)

相关文章

  • 关于oc中遍历的效率算法研究

    关于oc中遍历的效率算法研究 在oc中,编写程序最常用的的算法莫过于对算法的遍历,下面我们来探索一下最常用的几种算...

  • OC优雅的数组过滤-项目常用

    OC优雅的数组过滤-项目常用,和循环遍历判断say no。但是其大数据遍历效率比循环遍历效率低。 更多谓词使用:i...

  • OC中的遍历

    一、使用for循环 要遍历字典、数组或者是集合,for循环是最简单也用的比较多的方法,示例如下 优点:简单 缺点:...

  • 数据结构课程 第八周 遍历二叉树

    存储结构为二叉链表 遍历 先序遍历递归算法 中序遍历递归算法 后序遍历递归算法 总结 时间O(n) 空间(O(n)...

  • NSArray

    简写NSSArray *arr = @"";常规遍历如果是OC数组可以使用OC中的增强for循环来遍历诸葛取出ar...

  • 数组遍历只有for循环吗

    当遇到大数据量需要遍历的时候,不得不考虑遍历的效率问题。研究了一下数组遍历方法和效率。总的来说,循环遍历有这么几种...

  • 二叉树三种遍历的实现(递归)

    前序递归遍历算法:访问根结点-->递归遍历根结点的左子树-->递归遍历根结点的右子树 中序递归遍历算法:递归遍历根...

  • KMP字符串查找算法

    关于 oc NSString 的 rangeOfString方法实现算法。 个人想法:(简单匹配算法) 例如: 有...

  • OC中的各种遍历

    OC中的各种遍历 iOS开发中我们经常遇到各种的数据处理,所以就会经常遇到数组遍历 和 字典遍历。但是不同的遍历方...

  • 剑指offer中关于二叉树题目的总结

    关于二叉树的问题,也就是涉及二叉树的四种遍历算法以及基本的删除、插入等操作 中序遍历和前序遍历/后序遍历的结合 题...

网友评论

      本文标题:关于oc中遍历的效率算法研究

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