1

我认为遍历 Blocks 比枚举更快,在某些情况下确实如此。然而,在这个简单的例子中,我有一个数据数组,我正在使用不同的迭代方法创建多个数组,结果不是我所期望的。

一个解释会对他有所帮助。

NSMutableArray *dataArray =[[[NSMutableArray alloc] init] autorelease];
NSMutableArray *mArray1 = [[[NSMutableArray alloc] init] autorelease];
NSMutableArray *mArray2 = [[[NSMutableArray alloc] init] autorelease];
NSMutableArray *mArray3 = [[[NSMutableArray alloc] init] autorelease];

NSDate *dt1 = [NSDate date];
for (int j=0; j<10000000;j++)
{
    [dataArray addObject:[NSNumber numberWithInt:j]];
}

NSDate *dt2 = [NSDate date];
int cnt = [dataArray count];
//Using normal for loop
for (int k=0; k<cnt;k++)
{
    [mArray1 addObject:[dataArray objectAtIndex:k]];
}

//Using Fast Enumeration
NSDate *dt3 = [NSDate date];
for (NSNumber *num in dataArray)
{
    [mArray2 addObject:num];
}


//Enumerating using Blocks
NSDate *dt4 = [NSDate date];
[dataArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [mArray3 addObject:obj];
}];
NSDate *dt5 = [NSDate date];

NSLog(@"Time taken to create the data array %f",[dt2 timeIntervalSinceDate:dt1]);
NSLog(@"Time taken to iterate using normal for loop %f",[dt3 timeIntervalSinceDate:dt2]);
NSLog(@"Time taken to iterate using fast enumeration %f",[dt4 timeIntervalSinceDate:dt3]);
NSLog(@"Time taken to iterate using blocks %f",[dt5 timeIntervalSinceDate:dt4]);

//创建数据数组所用时间 0.383750

//使用普通for循环0.309719迭代所花费的时间

//使用快速枚举迭代所花费的时间 0.278467

//使用块进行迭代所花费的时间 0.526629

4

3 回答 3

1

NSHipster ( @mattt ) 有一篇关于所有不同枚举器的非常好的帖子。阅读它,它将解释所有差异。

快速枚举更快,但块枚举的额外好处是拥有对象及其索引,这很有用!

于 2014-04-22T18:35:34.180 回答
0

就像 gimpycpu 所说,使用块的并发枚举是您将看到使用块枚举的性能影响的地方。利用 GCD 并枚举各种线程(在线程安全数据集上)可能是您所希望的。

示例枚举

图表/说明:结果

测试/代码示例:代码


如果并发是一个问题,请考虑尝试二进制搜索以显着提高性能。

  • 需要一个排序的NSArray。
于 2014-08-29T09:09:22.500 回答
0

我可以在不分析生成的程序集的情况下看到的唯一原因如下。

与其他循环方法相比,调用块具有开销。

您也可以尝试enumerateObjectsWithOptions:NSEnumerationConcurrent,实际上它可以比快速循环更快,因为它可以并行化。

请记住,如果您在块内使用同步的东西,if 不会更快(虽然不确定是否NSArray同步)

于 2014-04-22T18:35:25.580 回答