OC各种遍历方法的效率比较
看了一篇博客,挺有意思,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各种遍历方法的效率比较的更多相关文章
- HashMap的四种遍历方法,及效率比较(简单明了)
https://yq.aliyun.com/ziliao/210955 public static void main(String[] args) { HashMap<Integer, Str ...
- OC 类方法,对象方法,构造方法以及instancetype和id的异同
OC 类方法,对象方法,构造方法以及instancetype和id的异同 类方法: 类方法是可以直接使用类的引用,不需要实例化就可以直接使用的方法.一般写一些工具方法. 类方法: 声明和实现的时候,以 ...
- 专题三、ArrayList遍历方式以及效率比较
一.遍历方式 ArrayList支持三种遍历方式. 1.第一种,随机访问,它是通过索引值去遍历 由于ArrayList实现了RandomAccess接口,它支持通过索引值去随机访问元素. 代码如下: ...
- python基本数据类型list,tuple,set,dict用法以及遍历方法
1.list类型 类似于java的list类型,数据集合,可以追加元素与删除元素. 遍历list可以用下标进行遍历,也可以用迭代器遍历list集合 建立list的时候用[]括号 import sys ...
- List 的 removeAll 方法的效率
List 的 removeAll 方法的效率低的原因: 要遍历source,对dest进行contain操作,而contain又要遍历dest进行equal比较. 解决办法:dest转为set,用se ...
- PHP的几种遍历方法
PHP常用的遍历方法有三种,foreach,for,list()/each()和while,这三种方法中效率最高的是使用foreach语句遍历数组 一.使用for语句循环遍历数组 值得大家注意的是使用 ...
- map的三种遍历方法!
map的三种遍历方法! 集合的一个很重要的操作---遍历,学习了三种遍历方法,三种方法各有优缺点~~ /* * To change this template, choose Tools | Te ...
- HashMap有几种遍历方法?推荐使用哪种?
本文已收录<面试精选>系列,Gitee 开源地址:https://gitee.com/mydb/interview HashMap 的遍历方法有很多种,不同的 JDK 版本有不同的写法,其 ...
- 测试数组push和unshift方法的效率
先贴代码,之后再来补内容 <!DOCTYPE HTML> <html> <head> <title>测试数组push和unshift方法的效率</ ...
随机推荐
- opengl VAO ,VBO
A Vertex Array Object (VAO) is an object which contains one or more Vertex Buffer Objects and is des ...
- 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:6. 设备事件上报
文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...
- gcd(2018.10.24)
良心题,暴力枚举即可. 代码: #include<cstdio> #include<cmath> #include<algorithm> using namespa ...
- Mysql | 总结 | 常用的查询语句(单表查询)
1. 查询单表全部 select* from 数据表名; 2. 查询单表中一个或者多个字段 select 字段1,字段2 from 数据表名; 3. 查询单表中的指定信息 select* from 数 ...
- DRF教程3-类视图
Rewriting our API using class-based views 使用类视图重写root views,只需要一点点重构. from django.http import Http40 ...
- mac 终端查看端口命令
查看 端口所在线程 lsof -i:8080 mac-abeen:spider abeen$ lsof -i:8080 COMMAND PID USER FD TYPE DEVICE SIZE/OFF ...
- memcache学习
1.memcache和memcached区别 Memcache是该系统的项目名称,Memcached是该系统的主程序文件(字母d可以理解为daemon),以守护程序方式运行于一个或多个服务器中,随时接 ...
- Unity Shader入门精要学习笔记 - 第14章非真实感渲染
转载自 冯乐乐的 <Unity Shader 入门精要> 尽管游戏渲染一般都是以照相写实主义作为主要目标,但也有许多游戏使用了非真实感渲染(NPR)的方法来渲染游戏画面.非真实感渲染的一个 ...
- [转]Cordova android框架详解
本文转自:http://www.cnblogs.com/hubcarl/p/4202784.html 一.Cordova 核心java类说明 CordovaActivity:Cordova Activ ...
- phpmyadmin 出现Table 'root.pma_table_uiprefs' doesn't exist
原文链接:http://zhidao.baidu.com/link?url=ugBKDds94yxWhh_IZ6rZWZYSd2nO555EZ1WMClXRrqL0aKLc-HPDrZVSKZyDaD ...