美文网首页
iOS循环遍历 性能对比(for 、forin、NSEnumer

iOS循环遍历 性能对比(for 、forin、NSEnumer

作者: 殇鑫 | 来源:发表于2018-05-10 18:25 被阅读0次

    前段时间学习了NSEnumerator的遍历方法 感觉很好用 于是总结一下iOS生涯当中 所用到的遍历。好奇的简单了做了一个效率对比。没想到最NB的居然是它。

    1、for循环

    for循环不做过多介绍,入门常用、可以正序、逆序查询数据。也常用于创建九宫格。贴两行代码自己体会。

    //for--数组遍历
     for (int i = 0; i < self.traverseArray.count; i++) {
            
            NSLog(@"%@",self.traverseArray[i]);
            
        }
    
    //for--字典遍历
        NSArray *dictionaryArray = [self.traverseDictionary allKeys];
        
        for (int i = 0 ; i < dictionaryArray.count; i++) {
            
            NSLog(@"key = %@",dictionaryArray[i]);
        }
    

    2、forin 循环

    forin 遍历 又称快速遍历 简单实用 比for 循环等级高些 与for循环最明显的区别就是看不到循环次数及索引情况。数组是有序的 for循环过程中也是有序的,forin遍历过程中是根据数组中数据添加顺序而定的。

        for (NSString *str in self.traverseArray) {
            
            NSLog(@"%@",str);
            
        }
    
    

    forin 不可逆序遍历 !

    3、枚举器

    枚举器是一种苹果官方推荐的更加面向对象的一种遍历方式,相比于for循环,它具有高度解耦、面向对象、使用方便等优势
    想深入了解的我给大家推荐几篇文章

    //正序遍历数组
        [self.traverseArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    
            NSLog(@"正序%@",obj);
    
        }];
        
        //逆序遍历数组
        [self.traverseArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    
             NSLog(@"逆序%@",obj);
        }];
        
        //遍历字典
    #warning 字典是无序的不存在正序逆序
        [self.traverseDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
            
            NSLog(@"key:%@->value%@",key,value);
            
        }];
    

    4、dispatch_apply函数

    GCD dispatch_apply函数是一个同步调用,block任务执行n次后才返回。该函数比较适合处理耗时较长、迭代次数较多的情况。

        dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
        dispatch_apply(self.traverseArray.count, queue, ^(size_t insex) {
          
             NSLog(@"%@",self.traverseArray[insex]);
          
       });
    
    

    5、ReactiveCocoa 遍历方法

    ReactiveCocoa 中遍历主要是针对元组RACTuple,对于数组、字典的遍历都会包装成RACTuple进行处理。
    使用方法先集成ReactiveCocoa 点这里
    集成方法有所改变
    cocopods引入时 pod ‘ReactiveObjC’
    项目引入中 #import "ReactiveObjC/ReactiveObjC.h"

     //数组遍历
        [self.traverseArray.rac_sequence.signal subscribeNext:^(id x) {
    
            NSLog(@"%@",x);
        }];
     //字典遍历 相当于元组数据
        [self.traverseDictionary.rac_sequence.signal subscribeNext:^(id x) {
            // 解包元组,会把元组的值,按顺序给参数里面的变量赋值
            RACTupleUnpack(NSString *key,NSString*value) = x;
            
            NSLog(@"key=%@ value=%@",key,value);
            
        }];
    

    重点来了

    终于说到重点了看一下以上几种遍历方式 在100、10000、100000次遍历所耗时长。


    耗时时间表.png

    看图分析、自己领会。可以根据自己的需求使用不同的遍历方式!
    然后。。。然后没有然后了。
    Demo:https://github.com/DearWang/TraverseDemo

    参考文档

    https://github.com/ReactiveCocoa/ReactiveObjC
    https://www.jianshu.com/p/5d4a8be9baf7

    相关文章

      网友评论

          本文标题:iOS循环遍历 性能对比(for 、forin、NSEnumer

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