Cách tiếp cận khối tránh chạy thuật toán tra cứu cho mọi khóa :
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL* stop) {
NSLog(@"%@ => %@", key, value);
}];
Mặc dù NSDictionary
được triển khai dưới dạng hashtable (có nghĩa là chi phí tìm kiếm một phần tử là O(1)
), việc tra cứu vẫn làm chậm quá trình lặp của bạn bởi một yếu tố không đổi .
Các phép đo của tôi cho thấy rằng đối với một từ điển d
số ...
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
for (int i = 0; i < 5000000; ++i) {
NSNumber* value = @(i);
dict[value.stringValue] = value;
}
... tổng hợp các con số với cách tiếp cận khối ...
__block int sum = 0;
[dict enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSNumber* value, BOOL* stop) {
sum += value.intValue;
}];
... thay vì cách tiếp cận vòng lặp ...
int sum = 0;
for (NSString* key in dict)
sum += [dict[key] intValue];
... Nhanh hơn khoảng 40% .
EDIT : SDK mới (6.1+) xuất hiện để tối ưu hóa vòng lặp, do đó, cách tiếp cận vòng lặp hiện nhanh hơn khoảng 20% so với cách tiếp cận khối , ít nhất là đối với trường hợp đơn giản ở trên.
Swift
cú pháp, hãy tham khảo bài đăng này: stackoverflow.com/a/24111700/419348