使用for、forin和block遍历NSArray的效率的比较

代码:

#import <Foundation/Foundation.h>

extern uint64_t dispatch_benchmark(size_t count, void (^block)(void));
void processNumber(NSNumber *n);

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        // 创建一个数组并用随机数填充
        NSUInteger const capacity = 15;
        NSMutableArray *array = [NSMutableArray arrayWithCapacity:capacity];
        for (NSUInteger i = 0; i < capacity; ++i) {
            [array addObject:@(arc4random_uniform(100))];
        }

        size_t count = 10000000;
        // 使用for循环遍历数组
        uint64_t time1 = dispatch_benchmark(count, ^{
            for (NSUInteger i = 0; i < capacity; ++i) {
                processNumber(array[i]);
            }
        });
        NSLog(@"for = %lluns", time1);

        // 使用forin循环遍历数组
        uint64_t time2 = dispatch_benchmark(count, ^{
            for (NSNumber *num in array) {
                processNumber(num);
            }
        });
        NSLog(@"forin = %lluns", time2);

        // 使用block遍历数组
        uint64_t time3 = dispatch_benchmark(count, ^{
            [array enumerateObjectsUsingBlock:^(NSNumber *num, NSUInteger idx, BOOL *stop) {
                processNumber(num);
            }];
        });
        NSLog(@"block = %lluns", time3);

    }
    return 0;
}

void processNumber(NSNumber *n) {
    // code...
}

输出:

for = 326ns
forin = 237ns
block = 638ns

但是如果把所有的processNumber函数注释掉,输出的结果如下:

for = 20ns
forin = 106ns
block = 496ns

所以对于遍历数组,不能武断的得出某种方式效率一定最高的结论,实际的执行效果往往取决于代码编写的情况。

时间: 2024-09-29 05:11:39

使用for、forin和block遍历NSArray的效率的比较的相关文章

oc/object-c/ios哪种遍历NSArray/NSDictionary方式快?测试报告

做app的时候,总免不了要多次遍历数组或者字典.究竟哪种遍历方式比较快呢?我做了如下测试:首先定义测试用宏: ? 1 2 3 4 5 6 7 8 9 #define MULogTimeintervalBegin(INFO) NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];\ NSTimeInterval duration = 0;\ NSLog(@"MULogTimeintervalBegin:%@", IN

oc block 遍历数组及字典

原遍历数组NSArray * lines = ...for (NSString * line in lines) { // ...}for (int i = 0; i < lines.count; ++i) { NSString * s = [lines objectAtIndex:i]; ...} 原遍历字典 NSDictionary * dict = … NSArray * keys = [dict allKeys]; for (NSString * key in keys) { NSStr

遍历NSArray, NSDictionary, NSSet的方法总结

1,for循环读取 1 NSArray: 2 NSArray *array = /*…*/ 3 for(int i=0; i<array.count; i++) 4 { 5 id object = array[i]; 6 // do sth 7 } 8 9 NSDictionary: 10 NSDictionary *dic = /*…*/ 11 NSArray *keys = [dic allKeys]; 12 for(int i=0; i<keys.count; i++) 13 { 14

(原)使用block遍历元素的简明思路及实现

使用block遍历元素的简明思路及实现 转出“博客园”,请您注明出处:http://www.cnblogs.com/xiaobajiu/p/4116503.html NSArray这样的对象会有除了for遍历以外的block遍历方法如下: [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { //遍历每个元素 }]: [arr2 indexOfObjectPassingTest:^BOOL(id obj,

关于JavaScript中的for-in和for语法比较与效率区别

最近在写基于 JavaScript 的 Todos 的时候常常会需要遍历数组/类数组/对象的操作,一直以来都是使用的 for(var i = 0; i<length; i++) 这种写法,这次也是突发奇想使用了 for(var i in []/{}) 的遍历写法,然而给自己挖了巨大的陷阱,绕了很久才找到了错误.事后查了下资料,把它们的用法区别.效率差异记录下. 一. 基本用法 1. for(var i = 0; i<length; i++) 这种循环语句在各种编程语言中都是很重要的流程控制语句

专题三、ArrayList遍历方式以及效率比较

一.遍历方式 ArrayList支持三种遍历方式. 1.第一种,随机访问,它是通过索引值去遍历 由于ArrayList实现了RandomAccess接口,它支持通过索引值去随机访问元素. 代码如下: // 基本的forfor (int i = 0; i < size; i++){    value = list.get(i);} 2.第二种,foreach语句 foreach语句是java5的新特征之一,在遍历数组.集合方面,foreach为开发人员提供了极大的方便. 代码如下: for (In

遍历NSArray

NSArray *[email protected][@"1",@"2",@"3",@"4"]; 第一种方法 最常见的方法 for (int i = 0; i < arr.count; i++) { NSLog(@"%@",arr[i]); } 第二种方法  效率比较高 for (NSArray *ar in arr) { NSLog(@"%@",ar); } // 第三种方法 b

C++ std::vector 三种遍历方式的效率比较

#include <iostream> #include <vector> #include <stdint.h> #include <ctime> int main() { const uint32_t loop = 1000000; std::vector<int32_t> vec; clock_t timeStart = 0; for (uint32_t i = 0; i < loop; ++i) { vec.push_back(i)

for、foreach和Iterator遍历有什么(效率)区别

(问:1.for.foreach和Iterator遍历有什么区别    2.遍历删除ConcurrentModificationException异常.) 1.在形式上 for的形式是 for(int i=0;i<arr.size();i++){...} foreach的形式是 for(int i:arr){...} iterator的形式是 Iterator it = arr.iterator(); while(it.hasNext()){ object o =it.next(); ...}