L'approche par bloc évite d'exécuter l'algorithme de recherche pour chaque clé :
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL* stop) {
NSLog(@"%@ => %@", key, value);
}];
Même si elle NSDictionary
est implémentée sous forme de table de hachage (ce qui signifie que le coût de recherche d'un élément est O(1)
), les recherches ralentissent toujours votre itération d' un facteur constant .
Mes mesures montrent que pour un dictionnaire d
de nombres ...
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
for (int i = 0; i < 5000000; ++i) {
NSNumber* value = @(i);
dict[value.stringValue] = value;
}
... résumer les chiffres avec l'approche par blocs ...
__block int sum = 0;
[dict enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSNumber* value, BOOL* stop) {
sum += value.intValue;
}];
... plutôt que l'approche en boucle ...
int sum = 0;
for (NSString* key in dict)
sum += [dict[key] intValue];
... est environ 40% plus rapide .
EDIT : Le nouveau SDK (6.1+) semble optimiser l'itération de la boucle, donc l'approche en boucle est maintenant environ 20% plus rapide que l'approche en bloc , au moins pour le cas simple ci-dessus.
Swift
syntaxe, reportez-vous à cet article: stackoverflow.com/a/24111700/419348