Обход ключа / значений NSDictionary, enumerateKeysAndObjectsUsingBlock более эффективен, чем зацикливание ключей и вызов objectForkey :? - PullRequest
13 голосов
/ 22 сентября 2011

Мне нужно пройти через все пары ключ / значение в словаре и сделать что-то с обоими полями. Мне интересно, что является более эффективным, традиционный подход «ключ foreach» или подход блоков с использованием enumerateKeysAndObjectsUsingBlock:.

Вот вам пример:

Традиционный подход (до блоков)

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

Подход блоков.

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

У меня такое чувство, что обход пар ключ / значение с использованием блока происходит быстрее, но я не уверен, поскольку не знаю, как реализованы словари и метод конкретного блока.

Есть мысли?

Заранее спасибо!

Ответы [ 2 ]

11 голосов
/ 22 сентября 2011

Вы должны использовать блочный метод.Это быстрее, как показано здесь .В частности, он не требует дополнительного поиска в словаре для получения значения, что снижает производительность.Однако прирост производительности будет незначительным, если только он не работает с достаточно большими словарями.

11 голосов
/ 22 сентября 2011

Они будут в основном одинаковыми - они оба являются синхронными обходами.Тем не менее, следующее позволит параллельный обход, который будет быстрее:

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

}];
...