OC各种遍历方法的效率比较
2024-08-27 18:08:27
看了一篇博客,挺有意思,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);
}];
再者,项目中不会出现遍历这么多的数组元素,所以哪个适合自己就用哪个!
参考文档:原文
最新文章
- 添加Properties取值和枚举取值
- hdu 2048 神、上帝以及老天爷(错排)
- 完美解决IE6不支持position:fixed的bug
- delphi TTreeView组件遍历磁盘目录
- 试求由a,b,c三个字母组成的n位符号串中不出现aa图像的符号串的数目
- JavaScript入门(6)
- [leetcode]重建二叉树(先序和终须) 中序遍和后续
- iOS APP之本地数据存储(译)
- Centos下需安装Pytnon,Pytharm
- mvc的视图中显示DataTable的方法
- XMPP安装中遇到需要卸载openfire的步骤
- PHP之APC缓存详细介绍(学习整理)
- Java日期获取需求大全
- Codeforces785E - Anton and Permutation
- 利用ffmpeg做视频解码的顺序
- Winform Chart 控件读取datatable后显示图表
- SQL Server 2008 通过C# CLR 使用正则表达式
- 系统调用fork()在powerpc上的源码分析
- Lua代码规范
- bandwagon host
热门文章
- [Xcode 实际操作]一、博主领进门-(8)应用代理文件(AppDelegate.swift)详解
- css margin padding 四个方向
- Linux | C代码的编写、运行和调试
- PostgreSQL-8-数据合并
- 关于maven项目导入后缺jar包问题的处理方法
- zabbix图表中文乱码
- Java三种技术架构
- 使用express+mongoDB搭建多人博客 学习(4)登录与登出
- Unity Shader入门精要学习笔记 - 第5章 开始 Unity Shader 学习之旅
- prerender-spa-plugin预处理vue项目实践