2011-09-22 8 views
13

Potrzebuję przejść wszystkie pary klucz/wartość ze słownika i zrobić coś z oboma polami. Zastanawiam się, co jest bardziej skuteczne, tradycyjne podejście "foreach key" lub podejście bloków za pomocą enumerateKeysAndObjectsUsingBlock :.Przechodzenie kluczy/wartości NSDictionary, jest enumerateKeysAndObjectsUsingBlock bardziej wydajne niż zapętlanie kluczy i wywoływanie objectForkey :?

Tu masz przykład:

tradycyjne podejście (przed blokami) Podejście

for (NSString* key in [self.dictionary allKeys]) { 
    [self processKey:key value: [self.dictionary objectForKey:value ]]; 
} 

bloków.

[self.dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){ 
     [self processKey:key value:obj]; 
    }]; 

Mam przeczucie, że przejeżdżające par klucz/wartość przy użyciu bloku jest szybsze, ale nie jestem pewien, bo nie wiem, jak słowniki i konkretny sposób realizowany jest blok.

Jakieś myśli?

Z góry dziękuję!

+0

Masz na myśli objectForKey: key zamiast objectForKey: value? – ohthepain

Odpowiedz

11

Powinieneś użyć metody opartej na blokach. Jest to szybsze, jako shown here. W szczególności nie wymaga dodatkowego wyszukiwania w słowniku, aby pobrać wartość, co oszczędza wydajność. Jednak wzrost wydajności będzie znikomy, chyba że będzie działał na rozsądnie dużych słownikach.

11

Będą one zasadniczo takie same - oba są synchronicznymi przejazdami. Jednak następujące czynności pozwalają na równoległe przechodzenie, które byłoby szybsze:

[self.dictionary enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent 
           usingBlock:^(id key, id object, BOOL *stop) { 

}]; 
+1

Metoda blokowania jest trochę szybsza w przypadku dużych słowników, ponieważ nie wymaga generowania skrótu z każdego klucza, co jest dość powolne. Zobacz 'CFStringHashNSString()' tutaj: http://opensource.apple.com/source/CF/CF-476.17/CFString.c –

Powiązane problemy