Блочный подход позволяет избежать запуска алгоритма поиска для каждого ключа :
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL* stop) {
NSLog(@"%@ => %@", key, value);
}];
Даже несмотря на то, что NSDictionary
он реализован в виде хеш-таблицы (что означает, что стоимость поиска элемента равна O(1)
), поиск все равно замедляет вашу итерацию на постоянный коэффициент .
Мои измерения показывают, что для словаря d
чисел ...
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
for (int i = 0; i < 5000000; ++i) {
NSNumber* value = @(i);
dict[value.stringValue] = value;
}
... суммируя числа с блочным подходом ...
__block int sum = 0;
[dict enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSNumber* value, BOOL* stop) {
sum += value.intValue;
}];
... а не петлевой подход ...
int sum = 0;
for (NSString* key in dict)
sum += [dict[key] intValue];
... примерно на 40% быстрее .
РЕДАКТИРОВАТЬ : новый SDK (6.1+), кажется, оптимизирует итерацию цикла, так что подход цикла теперь примерно на 20% быстрее, чем подход блока , по крайней мере для простого случая выше.
Swift
синтаксисе, обратитесь к этому сообщению: stackoverflow.com/a/24111700/419348