zoukankan      html  css  js  c++  java
  • OC各种遍历方法的效率比较

    看了一篇博客,挺有意思,OC各种遍历方法的效率,打算自己也测试一番。看看,究竟哪一个的效率更好一些!

    准备工作:懒加载一个数组,创建一千万个对象添加到数组。

     1 #pragma mark - Lazy Methods
     2 - (NSMutableArray *)objArray {
     3     if (!_objArray) {
     4         _objArray = [NSMutableArray array];
     5         for (int i = 0; i < 10000000; i ++) {
     6             [_objArray addObject:[[NSObject alloc] init]];
     7         }
     8     }
     9     return _objArray;
    10 }

    1.测试普通 for 循环

    1 #pragma mark - 测试普通 for 循环
    2 - (void)testCommonForCycle {
    3     NSMutableArray *tempArray = [NSMutableArray array];
    4     NSLog(@"Beign");
    5     for (int i = 0; i < self.objArray.count; i ++) {
    6         [tempArray addObject:self.objArray[i]];
    7     }
    8     NSLog(@"End");
    9 }

    控制台输出:

    1 2016-03-16 16:59:33.301 OC各种遍历方法的效率比较[5462:405485] Beign
    2 2016-03-16 16:59:40.985 OC各种遍历方法的效率比较[5462:405485] End

    我晕,我这里耗时相差了 7.684s

    2.测试 for-in

    1 #pragma mark - 测试 for-in 
    2 - (void)testForInCycle {
    3     NSMutableArray *tempArray = [NSMutableArray array];
    4     NSLog(@"Beign");
    5     for (NSObject *obj in self.objArray) {
    6         [tempArray addObject:obj];
    7     }
    8     NSLog(@"End");
    9 }

    控制台输出:

    1 2016-03-16 17:06:35.303 OC各种遍历方法的效率比较[5477:410562] Beign
    2 2016-03-16 17:06:40.789 OC各种遍历方法的效率比较[5477:410562] End

    耗时相差了 5.486s。 Time(for-in) < Time(for)

    3.测试Block块

    1 #pragma mark - 测试Block
    2 - (void)testBlock {
    3     NSMutableArray *tempArray = [NSMutableArray array];
    4     NSLog(@"Beign");
    5     [self.objArray enumerateObjectsUsingBlock:^(NSObject *obj, NSUInteger idx, BOOL * _Nonnull stop) {
    6         [tempArray addObject:obj];
    7     }];
    8     NSLog(@"End");
    9 }

    控制台输出:

    1 2016-03-16 17:10:28.941 OC各种遍历方法的效率比较[5543:414507] Beign
    2 2016-03-16 17:10:36.603 OC各种遍历方法的效率比较[5543:414507] End

    耗时相差了 7.662s。Time(for-in) < Time(block) < Time(for)

    4.测试 枚举器

     1 #pragma mark - 测试 枚举器
     2 - (void)testEnumerator {
     3     NSMutableArray *tempArray = [NSMutableArray array];
     4     NSLog(@"Beign");
     5     NSEnumerator *enumerator = [self.objArray objectEnumerator];
     6     while (enumerator.nextObject) {
     7         [tempArray addObject:enumerator.nextObject];
     8     }
     9     NSLog(@"End");
    10 }

    控制台输出:

    1 2016-03-16 17:16:31.255 OC各种遍历方法的效率比较[5565:418958] Beign
    2 2016-03-16 17:16:37.447 OC各种遍历方法的效率比较[5565:418958] End

    耗时相差了 6.192s。

    粗略的得出的结论(不精确的):Time(for-in) < Time(enumerator) < Time(block) < Time(for)

    虽然粗略的看出 Block块循环耗时较高,但是我们可以看到Block块的优势:

    • 简化的代码
    • 可控性强
    1 NSArray *array = @[@"1", @"2", @"3", @"4"];
    2     [array enumerateObjectsUsingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) {
    3         if ([obj isEqualToString:@"2"]) {
    4             *stop = YES;
    5         }
    6         NSLog(@"obj=%@, idx=%lu", obj, idx);
    7     }];

    再者,项目中不会出现遍历这么多的数组元素,所以哪个适合自己就用哪个!

    参考文档:原文

  • 相关阅读:
    读取.properties配置文件并保存到另一个.properties文件内
    kafka启动报错:另一个程序正在使用此文件,进程无法访问。
    使用Spring boot 嵌入的tomcat不能启动: Unregistering JMX-exposed beans on shutdown
    java把map转json
    java代码生成xml 报错:HIERARCHY_REQUEST_ERR: 尝试在不允许的位置插入节点。
    查询数据库时mapper报错:It's likely that neither a Result Type nor a Result Map was specified.
    获取session
    Apache服务器运维笔记(2)----使用apxs来进行编译安装 mod_txt 模块
    Apache服务器运维笔记(2)----使用<IfDefine>容器实现不同的配置
    Apache服务器运维笔记(1)----运行多个Apache服务器
  • 原文地址:https://www.cnblogs.com/xiu619544553/p/5284329.html
Copyright © 2011-2022 走看看