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方法的效率</ ...
随机推荐
- std::thread 在DLLMain 中会发生死锁 std::thread cause deadlock in DLLMain
注意不要再DLLMain中使用 std::thread 否则会发生死锁. 但是可以使用 _beginthreadex (此函数可以使用lambda) 或者直接使用windows的底层函数: Creat ...
- [Xcode 实际操作]二、视图与手势-(9)CGAffineTransform仿射变换的使用
目录:[Swift]Xcode实际操作 本文将演示使用视图对象的仿射变换功能,旋转视图对象. import UIKit class ViewController: UIViewController { ...
- 详解什么是redis
企业中redis是必备的性能优化中间件,也是常见面试题,首先Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库.Redis全称为:Rem ...
- Java并发编程笔记
进程:程序的一次运行活动. 线程:程序的一个控制流程.用于执行一个任务.是cpu进行调度的最小单位. 死锁:所有的线程继续执行所需要的资源都被其他线程占用,导致所有线程都不能继续执行. 死锁的情景:1 ...
- UWP Popup 弹出提示框
一:需求 做一个类似于安卓的弹出消息框,如图.当用户点击下载或者选择时,能够从底部弹出一个提示框,用于提示用户. 二:Popup 类 不需要我们自己额外去写一个弹窗类,微软自己有一个Popup 弹窗类 ...
- 牛客寒假5-D.炫酷路途
链接:https://ac.nowcoder.com/acm/contest/331/D 题意: 小希现在要从寝室赶到机房,路途可以按距离分为N段,第i个和i+1个是直接相连的,只需要一秒钟就可以相互 ...
- 解决XP“不是有效Win32程序” 不是改Platform toolset
背景 最近在写一个窗口程序,想在Windows XP上也能跑.先用vs 2015的App Wizard生成了一个实例窗口程序,按照网上大部分攻略,将 "Properties - Genera ...
- 洛谷1941(dp)
常规的dp,当前有值且碰不到管子就转移,可以连跳的操作我就加了一维表示当前是不是连跳过来的.第二问前缀和即可得(不对啊边走边记录就行了吧我冗了Orz). #include <cstdio> ...
- 535 Encode and Decode TinyURL 编码和解码精简URL地址
详见:https://leetcode.com/problems/encode-and-decode-tinyurl/description/ C++: class Solution { public ...
- js获取窗口参数
window.onscroll=function getScrollTop(){ console.log(scrollTop) if(document.documentElement&& ...