Podejście blokowe pozwala uniknąć uruchamiania algorytmu wyszukiwania dla każdego klucza :
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL* stop) {
NSLog(@"%@ => %@", key, value);
}];
Mimo że NSDictionary
jest implementowany jako tablica mieszająca (co oznacza, że koszt wyszukiwania elementu wynosi O(1)
), wyszukiwania wciąż spowalniają twoją iterację o stały czynnik .
Moje pomiary pokazują, że dla słownika d
liczb ...
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
for (int i = 0; i < 5000000; ++i) {
NSNumber* value = @(i);
dict[value.stringValue] = value;
}
... sumując liczby z podejściem blokowym ...
__block int sum = 0;
[dict enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSNumber* value, BOOL* stop) {
sum += value.intValue;
}];
... zamiast podejścia w pętli ...
int sum = 0;
for (NSString* key in dict)
sum += [dict[key] intValue];
... jest około 40% szybszy .
EDYCJA : Nowy zestaw SDK (6.1+) wydaje się optymalizować iterację pętli, więc podejście do pętli jest teraz około 20% szybsze niż podejście do bloku , przynajmniej w powyższym prostym przypadku.
Swift
składni, zapoznaj się z tym postem: stackoverflow.com/a/24111700/419348