हालांकि यह सवाल पुराना है, चीजें बदल नहीं रही हैं, लेकिन स्वीकृत उत्तर गलत है।
enumerateObjectsUsingBlock
एपीआई विषय वस्तु नहीं था for-in
, लेकिन एक पूरी तरह से अलग उपयोग स्थिति के लिए:
- यह मनमानी, गैर-स्थानीय तर्क के आवेदन की अनुमति देता है। यानी आपको यह जानने की जरूरत नहीं है कि ब्लॉक एक सरणी पर इसका उपयोग करने के लिए क्या करता है।
- बड़े संग्रह या भारी संगणना के लिए समवर्ती गणना (
withOptions:
पैरामीटर का उपयोग करके )
फास्ट एन्यूमरेशन for-in
अभी भी एक संग्रह की गणना करने का मुहावरेदार तरीका है।
फास्ट एन्यूमरेशन से कोड, पठनीयता और अतिरिक्त अनुकूलन की संक्षिप्तता से लाभ होता है जो इसे अस्वाभाविक रूप से तेज बनाता है। एक पुराने सी के लिए तेजी से लूप!
एक त्वरित परीक्षण का निष्कर्ष है कि iOS 7 पर वर्ष 2014 में, enumerateObjectsUsingBlock
फॉर-इन (100 आइटम सरणी के 1 मिमी पुनरावृत्तियों के आधार पर) की तुलना में लगातार 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