2011-09-22 49 views
13

我需要遍歷字典的所有鍵/值對,並對兩個字段執行某些操作。我想知道什麼是更有效率,傳統的'foreach關鍵'方法或塊方法使用enumerateKeysAndObjectsUsingBlock :.遍歷鍵/值的NSDictionary,是enumerateKeysAndObjectsUsingBlock比循環鍵和調用objectForkey更高效:?

這裏有一個例子:

傳統的方法(塊)之前

for (NSString* key in [self.dictionary allKeys]) { 
    [self processKey:key value: [self.dictionary objectForKey:value ]]; 
} 

塊的方法。

[self.dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){ 
     [self processKey:key value:obj]; 
    }]; 

我的直覺是,遍歷使用塊的鍵/值對速度更快,但我不知道,因爲我不知道怎樣詞典和特定塊的方法來實現。

有什麼想法?

在此先感謝!

+0

你的意思是objectForKey:key而不是objectForKey:value? – ohthepain

回答

11

您應該使用基於塊的方法。這是更快的,因爲shown here。特別是,它不需要在字典中進行額外的查找來獲取值,從而可以節省性能。但是,除非使用合理大小的字典進行操作,否則性能收益可以忽略不計。

11

他們會基本相同 - 他們都是同步遍歷。但是,以下內容將允許併發遍歷,這將會更快:

[self.dictionary enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent 
           usingBlock:^(id key, id object, BOOL *stop) { 

}]; 
+1

對於大型字典,塊方法比較快,因爲它不需要從每個密鑰生成哈希,這很慢。請參閱'CFStringHashNSString()':http://opensource.apple.com/source/CF/CF-476.17/CFString.c –