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 NSDictionarydie 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 dder 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.
SwiftSyntax iterieren , lesen