যদিও এই প্রশ্নটি পুরানো, জিনিসগুলি পরিবর্তিত হয়নি, গৃহীত উত্তরটি ভুল।
enumerateObjectsUsingBlock
এপিআই রহিত বোঝানো হয় নি for-in
, কিন্তু একটি সম্পূর্ণ ভিন্ন ব্যবহারের ক্ষেত্রে জন্য:
- এটি স্বেচ্ছাসেবী, অ-স্থানীয় যুক্তির প্রয়োগের অনুমতি দেয়। উদাহরণস্বরূপ আপনার অ্যারেতে ব্লকটি কী ব্যবহার করে তা জানতে হবে না।
- বড় সংগ্রহ বা ভারী গণনার জন্য একত্রে গণনা (
withOptions:
প্যারামিটার ব্যবহার করে )
দ্রুত গণনা সহ for-in
এখনও একটি সংগ্রহের গণনা করার আইডেম্যাটিক পদ্ধতি।
কোডের বংশবৃদ্ধি, পাঠযোগ্যতা এবং অতিরিক্ত অপ্টিমাইজেশানগুলি থেকে দ্রুত গণনার উপকার হয় যা এটিকে অপ্রাকৃতিকভাবে দ্রুত করে তোলে। লু-লুপের চেয়ে পুরানো সি এর চেয়ে দ্রুত!
একটি দ্রুত পরীক্ষা সিদ্ধান্তে পৌঁছেছে যে ২০১৪ সালে আইওএস on-তে, enumerateObjectsUsingBlock
ধারাবাহিকভাবে ইন-ইন (১০০ আইটেমির অ্যারের ১ মিমি পুনরাবৃত্তির উপর ভিত্তি করে) তুলনায় 700০০% ধীর গতিতে থাকে।
কর্মক্ষমতা এখানে কি বাস্তব ব্যবহারিক উদ্বেগ?
বিরল ব্যতিক্রম ছাড়া অবশ্যই না।
পয়েন্টটি হ'ল enumerateObjectsUsingBlock:
ওভার ব্যবহারের খুব কম সুবিধা রয়েছে তা দেখানোর জন্যfor-in
কারণ ব্যতীত । এটি কোডটি আরও পঠনযোগ্য ... বা দ্রুত ... বা থ্রেড-নিরাপদ করে না। (অন্য একটি সাধারণ ভুল ধারণা)।
পছন্দটি ব্যক্তিগত পছন্দকে নেমে আসে। আমার জন্য, আইডোমেটিক এবং পঠনযোগ্য বিকল্পটি জয়ী। এই ক্ষেত্রে, এটি ব্যবহার করে দ্রুত গণনা for-in
।
মাপকাঠি:
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);
ফলাফল:
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