可可:为什么for-each比循环更快?

时间:2012-08-24 04:47:24

标签: cocoa for-loop

我的应用程序以两种方式阅读所有联系人:

for循环:

    CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent ();
    long count = macContact.addressBook.people.count;
    for(int i=0;i<count;++i){
        ABPerson *person = [macContact.addressBook.people objectAtIndex:i];
        NSLog(@"%@",person);
    }
    NSLog(@"%f",CFAbsoluteTimeGetCurrent() - startTime);

的for-each

    CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent ();
    for(ABPerson *person in macContact.addressBook.people){
        NSLog(@"%@",person);
    }
    NSLog(@"%f",CFAbsoluteTimeGetCurrent() - startTime);

for-each只花了4秒钟在地址簿中枚举5000人,而for循环用了10分钟来完成同样的工作。

我想知道为什么性能会有很大差异?

1 个答案:

答案 0 :(得分:5)

性能上的差异几乎肯定与macContact.addressBook.people部分有关。你每次都通过for循环调用它,但只有一次使用for-each循环。我猜测addressBookpeople属性不会返回缓存数据,而是每次都返回新数据。

尝试使用

NSArray *people = macContact.addressBook.people;
for (int i = 0; i < [people count]; i++) {
    NSLog(@"%@", [people objectAtIndex:i];
}

你可能会发现性能再次非常相似。


那就是说,for-each比一般情况要快。原因是因为for循环在每次通过循环(-objectAtIndex:)时调用方法发送,而for-each可以通过大批量获取对象来更有效地获取对象。

在更新版本的操作系统中,您可以更进一步,使用基于块的枚举方法。这看起来像

[macContact.addressBook.people enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL stop){
    NSLog(@"%@", obj);
}];

对于NSArrays,它应该具有与for-each循环非常相似的性能。对于其他数据结构(如字典),此样式可以更快,因为它可以随键获取值(而for-each仅为您提供键并要求您使用消息send来获取值)。