2010-09-10 6 views
9

मेरा मतलब क्लैंग या जीसीसी संस्करण के वर्तमान कार्यान्वयन में है।उद्देश्य-सी में अपवादों का उपयोग करने की लागत क्या है?

सी ++ और जावा लोग हमेशा मुझे बताते हैं कि अपवादों को तब तक किसी भी प्रदर्शन की लागत नहीं है जब तक कि उन्हें फेंक दिया न जाए। उद्देश्य-सी के लिए भी यही सच है?

+0

मुझे यकीन है कि सी ++ लोग आमतौर पर आपको बताते हैं कि अपवादों की लागत * नगण्य * फेंकने तक होती है। –

उत्तर

9

सी ++ और जावा लोग हमेशा मुझे बताते हैं कि अपवादों को तब तक किसी भी प्रदर्शन की लागत नहीं है जब तक कि उन्हें फेंक दिया न जाए। उद्देश्य-सी के लिए भी यही सच है?

लघु उत्तर

केवल 64-बिट ओएस एक्स और iOS में।

वे पूरी तरह से स्वतंत्र नहीं हैं। अधिक सटीक होने के लिए, मॉडल को नियमित निष्पादन (अन्यत्र चलने वाले परिणामों) के दौरान लागत को कम करने के लिए अनुकूलित किया गया है।

विस्तृत जवाब

32 बिट ओएस एक्स और iOS पर, अपवाद क्रम लागत भले ही वे फेंक दिया नहीं कर रहे हैं। ये आर्किटेक्चर शून्य लागत अपवादों का उपयोग नहीं करते हैं।

64 बिट ओएस एक्स में, ओबीजेसी सी ++ की "शून्य लागत अपवाद" उधार लेने के लिए आगे बढ़ गया। शून्य लागत अपवादों में बहुत कम निष्पादन ओवरहेड होता है, जब तक फेंक दिया जाता है। शून्य लागत अपवाद प्रभावी ढंग से बाइनरी आकार में निष्पादन लागत को स्थानांतरित करते हैं। यह उन प्राथमिक कारणों में से एक था जिन्हें प्रारंभ में आईओएस में इस्तेमाल नहीं किया गया था। सी ++ अपवादों और आरटीटीआई को सक्षम करने से बाइनरी आकार 50% से अधिक हो सकता है - बेशक, मैं उम्मीद करता हूं कि उन संख्याओं को शुद्ध ओबीजेसी में बहुत कम होना चाहिए क्योंकि अनचाहे होने पर निष्पादित करने के लिए कम है।

arm64 में, अपवाद मॉडल को सेट जंप लांग जंप से इटेनियम-व्युत्पन्न शून्य लागत अपवादों (असेंबली द्वारा निर्णय) में बदल दिया गया था।

हालांकि, मुहावरेदार ObjC कार्यक्रमों लिखित या, अपवाद से उबरने के लिए ताकि आप स्थितियों जो आप से उबरने के लिए इरादा नहीं है के लिए उनके उपयोग को आरक्षित करना चाहिए (यदि आप सब पर उन्हें इस्तेमाल करने का फैसला) तैयार नहीं हैं। Clang manual on ARC में और संदर्भित पृष्ठ के अन्य सेक्टनों में अधिक जानकारी।

+3

इसके अलावा, आपको उन समस्याओं को इंगित करना चाहिए जो एआरसी के लिए अपवाद का कारण बनते हैं: http://clang.llvm.org/docs/AutomaticReferenceCounting।एचटीएमएल - "बनाना कोड अपवाद-सुरक्षित डिफ़ॉल्ट रूप से अपवाद पर डिफ़ॉल्ट है, जो ठीक है, तो प्रक्रिया है द्वारा कोड है कि आम तौर वास्तव में अपवाद सुरक्षा के बारे में परवाह नहीं करता पर गंभीर क्रम और कोड आकार दंड अधिरोपित हैं इसलिए, एआरसी द्वारा उत्पन्न कोड लीक। वैसे भी तुरंत समाप्त हो जाएगा। " –

+0

@BradLarson महान संदर्भ - धन्यवाद +1, और कहा। यह ध्यान देने योग्य है कि केवल बात यह है कि * है * सही मायने में निष्पादन में एआरसी के लिए विशिष्ट है लायक हो सकता है: "। एआरसी' __weak' वस्तुओं के जीवन काल का अंत हो जब एक अपवाद उनके कार्यक्षेत्र समाप्त हो जाता है, जब तक कि अपवाद संकलक में अक्षम हैं करता है "* *। लिंक किए गए विवरण निश्चित रूप से क्यों अपवाद ObjC कार्यक्रमों में से बरामद नहीं किया जा सकता (मज़बूती से, एक अच्छी तरह से परिभाषित ढंग से) के उदाहरण अर्हता प्राप्त मदद करता है। – justin

+0

मेरे लिए ठीक है। उम्मीद है कि वे इसे इस तरह से छोड़ दें :-) एक एफिल प्रोग्रामर के रूप में मुझे अपवादों से नफरत है और उनका उपयोग बेहद सीमित है। – Lothar

6

मैक ओएस एक्स v10.5 में ऑब्जेक्टिव-सी रनटाइम के लिए 2007 के रिलीज नोट्स के मुताबिक, उन्होंने "शून्य लागत" प्रयास ब्लॉक और सी ++ के साथ अंतःक्रियाशीलता प्रदान करने के लिए उद्देश्य-सी अपवादों के 64 बिट कार्यान्वयन को फिर से लिखा है। ।

स्पष्ट रूप से, इन "शून्य लागत" प्रयासों को प्रयास करते समय कोई समय जुर्माना नहीं लगाता है, इसके 32-बिट समकक्ष के विपरीत, जिसे setjmp() और अन्य कार्यों को कॉल करना होगा। जाहिर है उन्हें फेंकना "बहुत महंगा" है।

यह एकमात्र जानकारी है जो मुझे ऐप्पल के रिलीज नोट्स में मिल सकती है, इसलिए मुझे यह मानना ​​होगा कि यह आज भी चलने वाले समय में लागू होता है, और इस तरह, 32 बिट अपवाद = महंगा, 64-बिट अपवाद = "शून्य लागत "

+0

पूर्णता के लिए [64-बिट शून्य-लागत सी ++ - संगत अपवाद] (https://developer.apple.com/library/mac/#releasenotes/Cocoa/RN-ObjectiveC/_index.html#//apple_ref/doc/ uid/TP40004309-CH1-DontLinkElementID_11) –

संबंधित मुद्दे