Pendekatan blok menghindari menjalankan algoritma pencarian untuk setiap kunci :
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL* stop) {
NSLog(@"%@ => %@", key, value);
}];
Meskipun NSDictionary
diimplementasikan sebagai hashtable (yang berarti bahwa biaya mencari elemen adalah O(1)
), pencarian masih memperlambat iterasi Anda dengan faktor konstan .
Pengukuran saya menunjukkan bahwa untuk kamus d
angka ...
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
for (int i = 0; i < 5000000; ++i) {
NSNumber* value = @(i);
dict[value.stringValue] = value;
}
... merangkum angka-angka dengan pendekatan blok ...
__block int sum = 0;
[dict enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSNumber* value, BOOL* stop) {
sum += value.intValue;
}];
... daripada pendekatan loop ...
int sum = 0;
for (NSString* key in dict)
sum += [dict[key] intValue];
... sekitar 40% lebih cepat .
EDIT : SDK baru (6.1+) muncul untuk mengoptimalkan iterasi loop, sehingga pendekatan loop sekarang sekitar 20% lebih cepat daripada pendekatan blok , setidaknya untuk kasus sederhana di atas.
Swift
sintaks, lihat posting ini: stackoverflow.com/a/24111700/419348