通过块迭代与快速枚举和循环迭代

时间:2014-04-22 18:21:43

标签: objective-c cocoa for-loop objective-c-blocks fast-enumeration

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

他会给你一个解释。

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

//使用normal for循环0.309719进行迭代所需的时间

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

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

3 个答案:

答案 0 :(得分:1)

关于所有不同的普查员,我们有一个非常好的post by NSHipster@mattt)。读一读,它将解释所有的差异。

快速枚举更快,但是您可以使用块枚举来获得有用的对象及其索引的额外好处!

答案 1 :(得分:0)

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

与其他循环方法相比,

调用块会产生开销。

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

请记住,如果您在块中使用同步内容(如果NSArray未同步,则不会更快),如果不会更快

答案 2 :(得分:0)

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

样本枚举

图表/说明:Results

测试/代码示例:Code


如果并发性存在问题,请考虑尝试二进制搜索以获得相当大的性能提升。

  • 需要已排序 NSArray。