看了一篇博客,挺有意思,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);
}];

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

参考文档:原文

最新文章

  1. 添加Properties取值和枚举取值
  2. hdu 2048 神、上帝以及老天爷(错排)
  3. 完美解决IE6不支持position:fixed的bug
  4. delphi TTreeView组件遍历磁盘目录
  5. 试求由a,b,c三个字母组成的n位符号串中不出现aa图像的符号串的数目
  6. JavaScript入门(6)
  7. [leetcode]重建二叉树(先序和终须) 中序遍和后续
  8. iOS APP之本地数据存储(译)
  9. Centos下需安装Pytnon,Pytharm
  10. mvc的视图中显示DataTable的方法
  11. XMPP安装中遇到需要卸载openfire的步骤
  12. PHP之APC缓存详细介绍(学习整理)
  13. Java日期获取需求大全
  14. Codeforces785E - Anton and Permutation
  15. 利用ffmpeg做视频解码的顺序
  16. Winform Chart 控件读取datatable后显示图表
  17. SQL Server 2008 通过C# CLR 使用正则表达式
  18. 系统调用fork()在powerpc上的源码分析
  19. Lua代码规范
  20. bandwagon host

热门文章

  1. [Xcode 实际操作]一、博主领进门-(8)应用代理文件(AppDelegate.swift)详解
  2. css margin padding 四个方向
  3. Linux | C代码的编写、运行和调试
  4. PostgreSQL-8-数据合并
  5. 关于maven项目导入后缺jar包问题的处理方法
  6. zabbix图表中文乱码
  7. Java三种技术架构
  8. 使用express+mongoDB搭建多人博客 学习(4)登录与登出
  9. Unity Shader入门精要学习笔记 - 第5章 开始 Unity Shader 学习之旅
  10. prerender-spa-plugin预处理vue项目实践