A abordagem de bloco evita a execução do algoritmo de pesquisa para cada chave :
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL* stop) {
NSLog(@"%@ => %@", key, value);
}];
Embora NSDictionary
seja implementado como uma hashtable (o que significa que o custo de procurar um elemento é O(1)
), as pesquisas ainda diminuem sua iteração por um fator constante .
Minhas medidas mostram que, para um dicionário d
de números ...
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
for (int i = 0; i < 5000000; ++i) {
NSNumber* value = @(i);
dict[value.stringValue] = value;
}
... resumindo os números com a abordagem de bloco ...
__block int sum = 0;
[dict enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSNumber* value, BOOL* stop) {
sum += value.intValue;
}];
... em vez da abordagem de loop ...
int sum = 0;
for (NSString* key in dict)
sum += [dict[key] intValue];
... é cerca de 40% mais rápido .
EDIT : O novo SDK (6.1+) parece otimizar a iteração de loop, portanto, a abordagem de loop é agora cerca de 20% mais rápida que a abordagem de bloco , pelo menos no caso simples acima.
Swift
sintaxe, consulte este post: stackoverflow.com/a/24111700/419348