Der Blockansatz vermeidet das Ausführen des Suchalgorithmus für jeden Schlüssel :
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL* stop) {
NSLog(@"%@ => %@", key, value);
}];
Obwohl NSDictionary
die Implementierung als Hashtabelle implementiert ist (was bedeutet, dass die Kosten für die Suche nach einem Element hoch sind O(1)
), verlangsamen Suchvorgänge Ihre Iteration um einen konstanten Faktor .
Meine Messungen zeigen, dass für ein Wörterbuch d
der Zahlen ...
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
for (int i = 0; i < 5000000; ++i) {
NSNumber* value = @(i);
dict[value.stringValue] = value;
}
... die Zahlen mit dem Blockansatz zusammenfassen ...
__block int sum = 0;
[dict enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSNumber* value, BOOL* stop) {
sum += value.intValue;
}];
... anstatt des Loop-Ansatzes ...
int sum = 0;
for (NSString* key in dict)
sum += [dict[key] intValue];
... ist ungefähr 40% schneller .
BEARBEITEN : Das neue SDK (6.1+) scheint die Schleifeniteration zu optimieren, sodass der Schleifenansatz jetzt etwa 20% schneller ist als der Blockansatz , zumindest für den obigen einfachen Fall.
Swift
Syntax iterieren , lesen