L'approccio a blocchi evita di eseguire l'algoritmo di ricerca per ogni tasto :
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL* stop) {
NSLog(@"%@ => %@", key, value);
}];
Anche se NSDictionary
è implementato come hashtable (il che significa che il costo di cercare un elemento è O(1)
), le ricerche rallentano ancora la tua iterazione di un fattore costante .
Le mie misurazioni mostrano che per un dizionario d
di numeri ...
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
for (int i = 0; i < 5000000; ++i) {
NSNumber* value = @(i);
dict[value.stringValue] = value;
}
... riassumendo i numeri con l'approccio a blocchi ...
__block int sum = 0;
[dict enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSNumber* value, BOOL* stop) {
sum += value.intValue;
}];
... piuttosto che l'approccio loop ...
int sum = 0;
for (NSString* key in dict)
sum += [dict[key] intValue];
... è circa il 40% più veloce .
EDIT : il nuovo SDK (6.1+) sembra ottimizzare l'iterazione di loop, quindi l'approccio di loop è ora circa il 20% più veloce dell'approccio di blocco , almeno per il semplice caso sopra.
Swift
sintassi, consultare questo post: stackoverflow.com/a/24111700/419348