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     }];

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

    参考文档:原文

  • 相关阅读:
    python出现import _socket ImportError: DLL load failed: %1 不是有效的 Win32 应用程序问题
    python 从字符串中解析xml
    python快速上手-让繁琐工作自动化之超级秒表,解决判断输入为回车以及时间相减
    python利用socket模块,写一个最最简单的tcp通信
    centOS7运行qt程序出现error: #error "Qt requires C++11 support
    Ubuntu下面QT编译报错: 错误 :-1: error: collect2: ld 返回 1
    Ubuntu环境,qt creator中,出现Cannot run compiler 'g++' Maybe you forgot to setup the environment解决方案
    电脑屏幕自动随背景变化解决方法
    Linux QT Kit丢失Version为空?
    Django signal 信号量
  • 原文地址:https://www.cnblogs.com/xiu619544553/p/5284329.html
Copyright © 2011-2022 走看看