Blok yaklaşımı , her anahtar için arama algoritmasını çalıştırmayı önler :
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL* stop) {
NSLog(@"%@ => %@", key, value);
}];
Her ne NSDictionary
kadar bir karma tablo olarak uygulansa da (bir öğeye bakmanın maliyeti olduğu anlamına gelir O(1)
), aramalar yinelemenizi sabit bir faktörle yavaşlatır .
Ölçümlerim bir d
sayı sözlüğü için ...
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
for (int i = 0; i < 5000000; ++i) {
NSNumber* value = @(i);
dict[value.stringValue] = value;
}
... sayıları blok yaklaşımı ile özetliyor ...
__block int sum = 0;
[dict enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSNumber* value, BOOL* stop) {
sum += value.intValue;
}];
... döngü yaklaşımı yerine ...
int sum = 0;
for (NSString* key in dict)
sum += [dict[key] intValue];
... yaklaşık% 40 daha hızlı .
DÜZENLEME : Yeni SDK (6.1+) döngü yinelemeyi optimize ediyor gibi göründüğünden , döngü yaklaşımı artık en azından yukarıdaki basit durum için blok yaklaşımından yaklaşık% 20 daha hızlıdır .
Swift
Sözdiziminde yineleme