我的应用程序以两种方式阅读所有联系人:
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分钟来完成同样的工作。
我想知道为什么性能会有很大差异?
答案 0 :(得分:5)
性能上的差异几乎肯定与macContact.addressBook.people
部分有关。你每次都通过for循环调用它,但只有一次使用for-each循环。我猜测addressBook
或people
属性不会返回缓存数据,而是每次都返回新数据。
尝试使用
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来获取值)。