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

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

 #pragma mark - Lazy Methods
- (NSMutableArray *)objArray {
if (!_objArray) {
_objArray = [NSMutableArray array];
for (int i = ; i < ; i ++) {
[_objArray addObject:[[NSObject alloc] init]];
}
}
return _objArray;
}

1.测试普通 for 循环

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

控制台输出:

 -- ::33.301 OC各种遍历方法的效率比较[:] Beign
-- ::40.985 OC各种遍历方法的效率比较[:] End

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

2.测试 for-in

 #pragma mark - 测试 for-in
- (void)testForInCycle {
NSMutableArray *tempArray = [NSMutableArray array];
NSLog(@"Beign");
for (NSObject *obj in self.objArray) {
[tempArray addObject:obj];
}
NSLog(@"End");
}

控制台输出:

 -- ::35.303 OC各种遍历方法的效率比较[:] Beign
-- ::40.789 OC各种遍历方法的效率比较[:] End

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

3.测试Block块

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

控制台输出:

 -- ::28.941 OC各种遍历方法的效率比较[:] Beign
-- ::36.603 OC各种遍历方法的效率比较[:] End

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

4.测试 枚举器

 #pragma mark - 测试 枚举器
- (void)testEnumerator {
NSMutableArray *tempArray = [NSMutableArray array];
NSLog(@"Beign");
NSEnumerator *enumerator = [self.objArray objectEnumerator];
while (enumerator.nextObject) {
[tempArray addObject:enumerator.nextObject];
}
NSLog(@"End");
}

控制台输出:

 -- ::31.255 OC各种遍历方法的效率比较[:] Beign
-- ::37.447 OC各种遍历方法的效率比较[:] End

耗时相差了 6.192s。

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

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

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

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

参考文档:原文

OC各种遍历方法的效率比较的更多相关文章

  1. HashMap的四种遍历方法,及效率比较(简单明了)

    https://yq.aliyun.com/ziliao/210955 public static void main(String[] args) { HashMap<Integer, Str ...

  2. OC 类方法,对象方法,构造方法以及instancetype和id的异同

    OC 类方法,对象方法,构造方法以及instancetype和id的异同 类方法: 类方法是可以直接使用类的引用,不需要实例化就可以直接使用的方法.一般写一些工具方法. 类方法: 声明和实现的时候,以 ...

  3. 专题三、ArrayList遍历方式以及效率比较

    一.遍历方式 ArrayList支持三种遍历方式. 1.第一种,随机访问,它是通过索引值去遍历 由于ArrayList实现了RandomAccess接口,它支持通过索引值去随机访问元素. 代码如下: ...

  4. python基本数据类型list,tuple,set,dict用法以及遍历方法

    1.list类型 类似于java的list类型,数据集合,可以追加元素与删除元素. 遍历list可以用下标进行遍历,也可以用迭代器遍历list集合 建立list的时候用[]括号 import sys ...

  5. List 的 removeAll 方法的效率

    List 的 removeAll 方法的效率低的原因: 要遍历source,对dest进行contain操作,而contain又要遍历dest进行equal比较. 解决办法:dest转为set,用se ...

  6. PHP的几种遍历方法

    PHP常用的遍历方法有三种,foreach,for,list()/each()和while,这三种方法中效率最高的是使用foreach语句遍历数组 一.使用for语句循环遍历数组 值得大家注意的是使用 ...

  7. map的三种遍历方法!

    map的三种遍历方法!   集合的一个很重要的操作---遍历,学习了三种遍历方法,三种方法各有优缺点~~ /* * To change this template, choose Tools | Te ...

  8. HashMap有几种遍历方法?推荐使用哪种?

    本文已收录<面试精选>系列,Gitee 开源地址:https://gitee.com/mydb/interview HashMap 的遍历方法有很多种,不同的 JDK 版本有不同的写法,其 ...

  9. 测试数组push和unshift方法的效率

    先贴代码,之后再来补内容 <!DOCTYPE HTML> <html> <head> <title>测试数组push和unshift方法的效率</ ...

随机推荐

  1. 进击python第三篇:基础

    基础拾遗 序列解包 例: >>>x,y,z=1,2,3 >>>print x,y,z 1 2 3 交换变量也是没问题 >>>x,y=y,x > ...

  2. [Xcode 实际操作]七、文件与数据-(18)使用MarkMan与设计师进行心灵沟通

    目录:[Swift]Xcode实际操作 本文将演示MarkMan的使用. 在界面开发过程中,最终的效果和设计稿难免有些出入, 通常是颜色.位置.尺寸方面的偏差,使用MarkMan助你领会设计师的意图. ...

  3. Apollo应用相关JVM配置参数

    -Dapollo_profile=github,auth-Ddev_meta=http://localhost:8080/-Dserver.port=8070-Dspring.datasource.u ...

  4. log日志中不打印异常栈的具体信息

    问题与分析 最近在查项目的log时发现报了大量的NPE(NullPointerException),诡异的是只log了Exception的类名,却没有具体的堆栈信息,以致于无法对该NPE异常进行准确定 ...

  5. 分布式通信-tcp/ip 单播

    服务端 public class SingleBroadCastSocketServer { public static void main(String[] args) { ServerSocket ...

  6. GYM 101673F(树计数)

    树上每个割点计算一下各个size的组合相乘再相加为第一问答案,取最大的:再把本答案中最大的两个size相乘减掉,为第二问答案. const int maxn = 1e4 + 5; int n, siz ...

  7. Github开源项目单

    以下涉及到的数据统计与 2019 年 5 月 1 日 12 点,数据来源:https://github.com/trending/java?since=monthly . 下面的内容从 Java 学习 ...

  8. ASP.NET页面传值的方法

    ASP.NET页面传值的方法 From:Refresh-air 在面试的时候,经常会遇到这样的问题,其实我们会对其中的几种方法比较熟悉,因为项目中经常使用.但是要全面的回答ASP.NET中页面传值的方 ...

  9. React 实践记录 04 Flux demo

    Introduction flux应用架构如下图所示,本文并不是讲述怎么立即做一个酷炫的应用,而是讲述如何依照这种框架,来进行代码的组织. 我们先把这个流程转述为文字:抛开与webAPI的交互不谈,以 ...

  10. CF1023D Array Restoration

    思路: 使用set即可,细节很多,容易出错. 实现: #include <bits/stdc++.h> using namespace std; const int INF = 0x3f3 ...