2012-08-24 33 views
3

我的應用程序讀取所有接觸的人有兩種方式:可可:爲什麼每個都比循環更快?

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人addressBook,而for-loop花了10分鐘來完成同樣的工作。

我想知道爲什麼性能有巨大差異?

回答

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循環每循環一次都會調用一次發送方法(-objectAtIndex:),而for-每次都可以通過大批量獲取對象來更有效地獲取對象。

在更新版本的OS中,您可以更進一步並使用基於塊的枚舉方法。這看起來像

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

對於NSArrays,它應該有一個非常類似於for-each循環的性能。對於其他數據結構(例如字典),這種風格可以更快,因爲它可以與鍵一起獲取值(而for-each僅爲您提供密鑰,並要求您使用消息發送來獲取值)。

+0

謝謝@凱文巴拉德! – NOrder

相關問題