Meskipun pertanyaan ini sudah tua, banyak hal belum berubah, jawaban yang diterima salah.
The enumerateObjectsUsingBlock
API tidak dimaksudkan untuk menggantikan for-in
, tapi untuk kasus penggunaan yang sama sekali berbeda:
- Ini memungkinkan penerapan logika non-lokal yang sewenang-wenang. yaitu Anda tidak perlu tahu apa yang dilakukan blok untuk menggunakannya pada array.
- Pencacahan serentak untuk koleksi besar atau perhitungan berat (menggunakan
withOptions:
parameter)
Enumerasi cepat dengan for-in
masih idiomatik metode untuk menghitung koleksi.
Penghitungan Cepat mendapat manfaat dari singkatnya kode, keterbacaan, dan optimisasi tambahan yang membuatnya cepat secara tidak wajar. Lebih cepat dari pada C-loop lama!
Tes cepat menyimpulkan bahwa pada tahun 2014 di iOS 7, enumerateObjectsUsingBlock
secara konsisten lebih lambat 700% dari pada untuk-in (berdasarkan iterasi 1mm dari array 100 item).
Apakah kinerja merupakan masalah praktis yang nyata di sini?
Jelas tidak, dengan pengecualian langka.
Intinya adalah untuk menunjukkan bahwa ada sedikit keuntungan untuk menggunakan enumerateObjectsUsingBlock:
lebih for-in
tanpa alasan yang benar-benar baik. Itu tidak membuat kode lebih mudah dibaca ... atau lebih cepat ... atau aman utas. (Kesalahpahaman umum lainnya).
Pilihannya adalah preferensi pribadi. Bagi saya, opsi idiomatis dan mudah dibaca menang. Dalam hal ini, yaitu Penghitungan Cepat menggunakan for-in
.
Benchmark:
NSMutableArray *arr = [NSMutableArray array];
for (int i = 0; i < 100; i++) {
arr[i] = [NSString stringWithFormat:@"%d", i];
}
int i;
__block NSUInteger length;
i = 1000 * 1000;
uint64_t a1 = mach_absolute_time();
while (--i > 0) {
for (NSString *s in arr) {
length = s.length;
}
}
NSLog(@"For-in %llu", mach_absolute_time()-a1);
i = 1000 * 1000;
uint64_t b1 = mach_absolute_time();
while (--i > 0) {
[arr enumerateObjectsUsingBlock:^(NSString *s, NSUInteger idx, BOOL *stop) {
length = s.length;
}];
}
NSLog(@"Enum %llu", mach_absolute_time()-b1);
Hasil:
2014-06-11 14:37:47.717 Test[57483:60b] For-in 1087754062
2014-06-11 14:37:55.492 Test[57483:60b] Enum 7775447746