कंप्यूटर विज्ञान अनुसंधान में आरसी बनाम ट्रेसिंग पर सर्वसम्मति लंबे समय से चल रही है, उस ट्रेसिंग में लंबे (अधिकतम) विराम के समय के बावजूद बेहतर CPU थ्रूपुट है। (उदाhere, here, और here देखें।) केवल हाल ही में, 2013 में, एक आरसी आधारित प्रणाली पेश करने वाला एक पेपर (उन तीनों के तहत अंतिम लिंक) रहा है जो सर्वोत्तम परीक्षण ट्रेसिंग जीसी की तुलना में समान रूप से थोड़ा बेहतर प्रदर्शन करता है सीपीयू थ्रूपुट। कहने की जरूरत नहीं है कि इसमें अभी तक कोई "असली" कार्यान्वयन नहीं है।
यहाँ एक छोटे से बेंचमार्क मैं सिर्फ 3.1 गीगा i5 के साथ मेरी iMac पर किया था, आईओएस 7.1 64-बिट सिम्युलेटर में है:
long tenmillion = 10000000;
NSTimeInterval t;
t = [NSDate timeIntervalSinceReferenceDate];
NSMutableArray *arr = [NSMutableArray arrayWithCapacity:tenmillion];
for (long i = 0; i < tenmillion; ++i)
[arr addObject:[NSObject new]];
NSLog(@"%f seconds: Allocating ten million objects and putting them in an array.", [NSDate timeIntervalSinceReferenceDate] - t);
t = [NSDate timeIntervalSinceReferenceDate];
for (NSObject *obj in arr)
[self doNothingWith:obj]; // Can't be optimized out because it's a method call.
NSLog(@"%f seconds: Calling a method on an object ten million times.", [NSDate timeIntervalSinceReferenceDate] - t);
t = [NSDate timeIntervalSinceReferenceDate];
NSObject *o;
for (NSObject *obj in arr)
o = obj;
NSLog(@"%f seconds: Setting a pointer ten million times.", [NSDate timeIntervalSinceReferenceDate] - t);
एआरसी विकलांग के साथ
(-fno-objc-arc
), यह निम्न देता है:
2.029345 seconds: Allocating ten million objects and putting them in an array.
0.047976 seconds: Calling a method on an object ten million times.
0.006162 seconds: Setting a pointer ten million times.
एआरसी सक्षम होने के साथ, कि हो जाता है:
1.794860 seconds: Allocating ten million objects and putting them in an array.
0.067440 seconds: Calling a method on an object ten million times.
0.788266 seconds: Setting a pointer ten million times.
जाहिर आवंटन obje सीटीएस और कॉलिंग विधियां कुछ हद तक सस्ता हो गईं। ऑब्जेक्ट पॉइंटर को असाइन करना, के आदेशों से अधिक महंगा हो गया है, हालांकि यह नहीं भूलना कि मैंने गैर-एआरसी उदाहरण में कॉल नहीं किया है, और ध्यान दें कि आप __unsafe_unretained
का उपयोग कर सकते हैं, क्या आपके पास कभी भी हॉटस्पॉट असाइन करना चाहिए पागल की तरह ऑब्जेक्ट पॉइंटर्स। फिर भी, अगर आप मेमोरी मैनेजमेंट को "भूलना" चाहते हैं और एआरसी डालने को कभी भी जहां चाहें कॉल को रिहा कर/रिलीज करना चाहते हैं, तो आप सामान्य स्थिति में, सीपीयू चक्रों को बार-बार और पॉइंटर्स सेट करने वाले सभी कोड पट्टियों में बर्बाद कर देंगे। दूसरी ओर एक ट्रेसिंग जीसी आपके कोड को अकेले छोड़ देती है, और केवल चुनिंदा क्षणों (आमतौर पर कुछ आवंटित करते समय) में जाती है, एक चीज में अपनी चीज करने से झुका हुआ होता है। (बेशक विवरण एक बहुत अधिक सच में जटिल, यह देखते हुए पीढ़ीगत जीसी, वृद्धिशील जीसी, समवर्ती जीसी, आदि कर रहे हैं)
तो हाँ, जब से ऑब्जेक्टिव-सी के आर सी परमाणु का उपयोग करता है/रिलीज बनाए रखने के लिए, यह नहीं बल्कि महंगा है , लेकिन उद्देश्य-सी में भी refcounting द्वारा लगाए गए की तुलना में कई और अक्षमता है। (उदाहरण के लिए, विधियों की पूरी तरह गतिशील/प्रतिबिंबित प्रकृति, जिसे किसी भी समय रन-टाइम पर "स्विज्ड" किया जा सकता है, संकलक को कई क्रॉस-विधि अनुकूलन करने से रोकता है जिसके लिए डेटा प्रवाह विश्लेषण और ऐसे की आवश्यकता होती है। Objc_msgSend () स्थिर विश्लेषक के दृष्टिकोण से हमेशा "गतिशील रूप से जुड़े" ब्लैक बॉक्स के लिए एक कॉल है, इसलिए कहने के लिए।) सभी उद्देश्य-सी में भाषा के रूप में सभी वास्तव में सबसे कुशल या सर्वोत्तम अनुकूलन योग्य नहीं है; लोग इसे एक कारण के लिए "सी के प्रकार की सुरक्षा को स्मॉलटाक की चमकदार गति के साथ कहते हैं" कहते हैं। ;-)
उद्देश्य-सी लिखते समय, आम तौर पर केवल एप्पल पुस्तकालयों के आसपास के उपकरणों के आसपास के यंत्र, जो निश्चित रूप से सी और सी ++ और असेंबली या उनके हॉटस्पॉट के लिए उपयोग करते हैं। आपके स्वयं के कोड को कभी भी कुशल होने की आवश्यकता नहीं है। जब कोई गर्म स्थान होता है, तो आप एक ही उद्देश्य-सी विधि के भीतर शुद्ध सी-शैली कोड जैसे निम्न स्तर की संरचनाओं को छोड़कर इसे बहुत ही कुशल बना सकते हैं, लेकिन किसी को शायद ही कभी इसकी आवश्यकता होती है। यही कारण है कि उद्देश्य-सी सामान्य मामले में एआरसी की लागत का खर्च उठा सकता है। मुझे अभी तक आश्वस्त नहीं है कि जीसी का पता लगाने में अंतर्निहित स्मृति-बाधित वातावरण में समस्याएं हैं और लगता है कि कोई भी उपकरण के लिए उचित रूप से उच्च स्तरीय भाषा का उपयोग कर सकता है, लेकिन स्पष्ट रूप से आरसी ऐप्पल/आईओएस के साथ बेहतर बैठता है। किसी को अब तक तैयार किए गए ढांचे और उनके सभी विरासत पुस्तकालयों पर विचार करना होगा जब वे खुद से पूछें कि वे एक ट्रेसिंग जीसी के साथ क्यों नहीं गए; उदाहरण के लिए मैंने सुना है कि आरसी कोरफॉउंडेशन में गहराई से बनाया गया है।
"कई अतिरिक्त निर्देश" - numeruos == एक; 'आईएनसी [एएसपी +12]'। इसके अलावा, उद्देश्य-सी हाथ से ट्यूनेड असेंबली का उपयोग करता है और एक संकलित भाषा => तेज़ भी है। –
उस आईएनसी पर एक एलओकेके उपसर्ग की आवश्यकता है, और यह ओबीजेसी की साइड टेबल को ध्यान में रखता है, और उपकरण –
का समर्थन करते हैं, मैं असहमत हूं, संदर्भ गिनती मैन्युअल मेमोरी प्रबंधन की जटिलताओं का प्रबंधन करने का एक बहुत ही प्रभावी तरीका है। यह सभी स्थितियों के लिए नहीं है, लेकिन प्रदर्शन और नियंत्रण अब तक किसी भी कचरा संग्रह प्रदर्शन करते हैं। –