ब्लॉक कुंजी हर कुंजी के लिए लुकअप एल्गोरिथ्म चलाने से बचती है :
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL* stop) {
NSLog(@"%@ => %@", key, value);
}];
भले ही हैशटेबल केNSDictionary
रूप में लागू किया गया हो (जिसका अर्थ है कि किसी तत्व को देखने की लागत है ), लुकअप अभी भी एक स्थिर कारक द्वारा आपके पुनरावृत्ति को धीमा कर देता है ।O(1)
मेरे माप से पता चलता है कि d
संख्याओं के शब्दकोश के लिए ...
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
for (int i = 0; i < 5000000; ++i) {
NSNumber* value = @(i);
dict[value.stringValue] = value;
}
... ब्लॉक दृष्टिकोण के साथ संख्याओं को सम्मिलित करें ...
__block int sum = 0;
[dict enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSNumber* value, BOOL* stop) {
sum += value.intValue;
}];
... पाश दृष्टिकोण के बजाय ...
int sum = 0;
for (NSString* key in dict)
sum += [dict[key] intValue];
... लगभग 40% तेज है ।
संपादित करें : नया एसडीके (6.1+) लूप पुनरावृत्ति को अनुकूलित करता प्रतीत होता है, इसलिए लूप अप्रोच ब्लॉक के दृष्टिकोण से लगभग 20% तेज है , कम से कम ऊपर के साधारण मामले के लिए।
Swift
सिंटैक्स में पुनरावृत्ति होती है, तो इस पोस्ट को देखें: stackoverflow.com/a/24111700/419348