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方法的效率</ ...
随机推荐
- spark sql 优化心得
本篇文章主要记录最近在使用spark sql 时遇到的问题已经使用心得. 1 spark 2.0.1 中,启动thriftserver 或者是spark-sql时,如果希望spark-sql run ...
- 关于idea中使用lamb表达式报错:ambda expressions are not supported at this language level
我使用的是jdk1.8,使用lamb表达式的时候,报错 ambda expressions are not supported at this language level, 后来,设置了 接着重启了 ...
- idea | 命名空间改过后重新导入项目方法
file菜单-->Open-->找到项目中pom文件-->会提示as project 和as file-->选择as project,会自动生成idea所有相关的文件
- 普通平衡树与文艺平衡树的splay代码
主要综合借鉴了yyb和马前卒两位大佬的. //普通平衡树 #include <cstdio> #include <cctype> #include <cstring> ...
- p标签中的文本换行
参考文章 word-break:break-all和word-wrap:break-word的区别 CSS自动换行.强制不换行.强制断行.超出显示省略号 属性介绍 white-space: 如何处理元 ...
- Jasper_crosstab_Parameter_Crosstab Header
corsstab: Q : how to show filed value at crosstab Header Part? A : via pass parameter in crosstab. i ...
- 《javascript设计模式》笔记之第七章:工厂模式
在读了这章之后,根据我个人现在的理解,工厂模式就是:将一个类或者一个方法称为一个工厂,然后再将一些模块交给这个工厂,让这个工厂按照给它的不同模块产出不同的实例. 下面为正文: 一:简单工厂: 例子: ...
- 我的NopCommerce之旅(4): 定时任务之邮件
一.功能简介 用户购买物品生成订单后,系统将发送邮件提醒给用户 二.操作步骤 后台配置一个系统的默认发送邮箱 启动定时任务,这里包括多个任务,只需要启动邮件任务 查看邮件发送情况 三.数据库分析 [d ...
- vs2013修改为双击打开文件
vs2012和vs2013默认是单击打开文件,让人突然就不习惯了,各种不爽. 修改方法: 工具-选项-环境-选项卡和窗口-不勾选允许在预览选项卡中打开新文件.
- 在WIN7、WIN8中,将快捷方式锁定到任务栏,C#
其实很简单,使用 API 函数 ShellExecute,就可以解决这个问题. 首先添加引用 using System.Runtime.InteropServices; 代码如下: using Sys ...