दिलचस्प पोस्ट
मैं Xcode प्रोजेक्ट में "बिल्ड सेटिंग्स" की एक सूची कैसे मुद्रित करूं? Std :: move () क्या है, और इसका उपयोग कब किया जाना चाहिए? क्या किसी टेबल फ़ील्ड में हाइफ़न हो सकता है? जेपीए में समग्र प्राथमिक कुंजी कैसे बना और संभालता है पृष्ठभूमि में एक .NET कंसोल एप्लिकेशन को चलाने के लिए एंड्रॉइड ओपनजीएल ईएस पारदर्शी पृष्ठभूमि मैं कैसे जांचूं अगर स्ट्रिंग में उद्देश्य-सी में कोई अन्य स्ट्रिंग है? एक ऐसी सरणी से तत्वों की एक जोड़ी ढूंढें जिनकी राशि दी गई संख्या के बराबर होती है उद्धरण चिह्नों के साथ उद्धृत स्ट्रिंग के लिए रेगेक्स कैसे एक HTML लिंक के माध्यम से एसएमएस शरीर पाठ को पूर्व में पॉप्युलेट करने के लिए इसका अर्थ क्या है कि जावास्क्रिप्ट एक प्रोटोटाइप आधारित भाषा है? HTTP POST अनुरोध में पैरामीटर कैसे भेजे जाते हैं? जावास्क्रिप्ट फ़ंक्शन पर एलियासिंग काम नहीं करता कैसे उबुन्टू पर postgresql को पूरी तरह से शुद्ध और पुन: इंस्टॉल करें? पिक्चरबॉक्स PaintEvent अन्य विधि के साथ

क्या सी ++ में अपवाद वास्तव में धीमा है

मैं सी ++ में सिस्टेमैटिक एरर हैंडलिंग देख रहा था- आंद्रेई एलेक्जेंड्रेस्को ने दावा किया कि Exceptions in C++ बहुत धीमे हैं

मुझे यह जानना है कि यह अभी भी C++98 लिए सही C++98

वेब के समाधान से एकत्रित समाधान "क्या सी ++ में अपवाद वास्तव में धीमा है"

अपवादों (इटेनियम अबी, वीसी ++ 64 बिट्स) के लिए आज इस्तेमाल किया गया मुख्य मॉडल शून्य-मूल्य मॉडल अपवाद है।

विचार यह है कि एक गार्ड को स्थापित करने और हर जगह अपवादों की उपस्थिति के लिए स्पष्ट रूप से जांच करके समय खोने के बजाय, कंपाइलर एक साइड टेबल उत्पन्न करता है जो कि किसी भी बिंदु को मैप करता है जो कि हैंडलर की सूची में एक अपवाद (प्रोग्राम काउंटर) डाल सकता है जब कोई अपवाद फेंका जाता है, तो इस सूची को सही हैंडलर (यदि कोई हो) लेने के लिए सलाह दी जाती है और ढेर अनावश्यक है

ठेठ if (error) रणनीति की तुलना में:

  • शून्य मूल्य मॉडल, जैसा कि नाम का अर्थ है, मुफ़्त है जब कोई अपवाद नहीं होता है
  • यह 10x / 20x एक के आसपास की लागत if एक अपवाद होता है

लागत, हालांकि, मापने के लिए तुच्छ नहीं है:

  • साइड-टेबल आमतौर पर ठंडा है , और इस प्रकार स्मृति से इसे लाया जाता है एक लंबा समय लगता है
  • सही हेन्डलर को निर्धारित करना आरटीटीआई शामिल है: कई आरटीटीआई डिस्क्रिप्टर्स को लाने, स्मृति के चारों ओर बिखरे हुए, और चलाने के लिए जटिल परिचालन (मूल रूप से प्रत्येक हेन्डलर के लिए dynamic_cast परीक्षण)

इसलिए, ज्यादातर कैश याद करते हैं, और इस तरह शुद्ध CPU कोड की तुलना में तुच्छ नहीं।

नोट: अधिक विवरण के लिए, TR18015 रिपोर्ट, अध्याय 5.4 अपवाद हैंडलिंग (पीडीएफ) पढ़ें।

तो, हाँ, अपवाद असाधारण रास्ते पर धीमा हो जाता है , लेकिन ये सामान्य रूप से स्पष्ट जांच ( if रणनीति) की तुलना में तेज़ हैं।

नोट: नोसएन्सएटएएल के अनुसार, आंद्रेई एलेक्जेंडरको इस "तेज" प्रश्न पूछ रहा है। मैंने अपने कार्यक्रमों में व्यक्तिगत रूप से गति को माप दिया और मुझे अभी तक अनुकूलन योग्यता के नुकसान के बारे में एक सबूत देखने की ज़रूरत नहीं है।


फर्क पड़ता है क्या ?

मैं दावा करता हूं कि ऐसा नहीं होता। एक प्रोग्राम को ध्यान में पठनीयता के साथ लिखा जाना चाहिए, न कि प्रदर्शन (कम से कम, पहले मानदंड के रूप में)। अपवाद तब इस्तेमाल किया जाता है जब कोई उम्मीद करता है कि कॉलर स्थान पर असफलता को संभाल नहीं सकता है या नहीं, और उसे स्टैक पास कर सकता है। बोनस: सी ++ में 11 अपवाद स्टैन्डर्ड लाइब्रेरी का इस्तेमाल करते हुए थ्रेड्स के बीच मार्शल किया जा सकता है।

यह सूक्ष्म है, हालांकि, मुझे map::find कि map::find को फेंकना नहीं चाहिए, लेकिन मैं map::find साथ ठीक हूँ map::find एक checked_ptr वापस checked_ptr जो फेंकता है यदि कोई dereference के प्रयास विफल हो जाता है क्योंकि यह शून्य है: बाद के मामले में, जैसा कि मामले में क्लास जो एलेक्जेंडर्रेस्को ने पेश किया, कॉलर स्पष्ट जांच और अपवादों पर भरोसा करते हुए चुनता है। कॉलर को अधिक जिम्मेदारी दिए बिना उसे सशक्त बनाना आमतौर पर अच्छा डिजाइन का संकेत है

जब प्रश्न पोस्ट किया गया था, मैं टैक्सी के इंतजार में डॉक्टर के पास गया था, इसलिए मेरे पास थोड़ी टिप्पणी के लिए समय था। लेकिन अब टिप्पणी की और upvoted और downvoted मैं बेहतर अपना खुद का जवाब जोड़ना चाहते हैं। यहां तक ​​कि अगर Matthieu का जवाब पहले से ही बहुत अच्छा है


अन्य भाषाओं की तुलना में अपवाद विशेषकर C ++ में धीमा हो सकता है?

फिर से दावा करें

"मैं सिमेंटिक त्रुटि हैंडलिंग सी ++ – आंद्रेई एलेक्जेंड्रेस्को में देख रहा था, उनका दावा है कि सी ++ में अपवाद बहुत धीमे हैं।"

यदि वह सचमुच आंद्रेई का दावा करता है, तो एक बार वह बहुत गुमराह करने वाला है, अगर गलत नहीं तो प्रोग्रामिंग भाषा की परवाह किए बिना भाषा में अन्य बुनियादी कार्यों की तुलना में उठाए गए / फेंका गए अपवाद हमेशा धीमा होते हैं । अन्य भाषाओं की तुलना में सिर्फ C ++ में या अधिक नहीं तो, सी + + में, जैसा कि कथित दावे इंगित करता है

आम तौर पर, भाषा की परवाह किए बिना, दो बुनियादी भाषा सुविधाओं जो बाकी की तुलना में धीमी गति के आदेश हैं, क्योंकि वे जटिल डेटा संरचनाओं को संभालने वाले रूटीन की कॉल करने के लिए अनुवाद करते हैं

  • अपवाद फेंकने, और

  • गतिशील स्मृति आवंटन

खुशी से सी ++ में एक अक्सर समय-महत्वपूर्ण कोड में दोनों से बच सकता है

दुर्भाग्य से, नि: शुल्क भोजन के रूप में ऐसी कोई चीज नहीं है , भले ही सी ++ की डिफ़ॉल्ट दक्षता बहुत करीब आती है। 🙂 अपवाद फेंकने और गतिशील स्मृति आवंटन से बचने के द्वारा हासिल की जाने वाली दक्षता आम तौर पर सीमेंट के निचले स्तर पर कोडिंग द्वारा सी ++ का इस्तेमाल करके "बेहतर सी" के रूप में प्राप्त की जाती है। और कम अमूर्त का अर्थ है "जटिलता"

बड़ी जटिलता का मतलब है कि रखरखाव पर खर्च करने के लिए और कोड पुन: उपयोग से थोड़ा और कोई फायदा नहीं है, जो वास्तविक मौद्रिक लागत हैं, भले ही अनुमान लगाने या मापना मुश्किल हो। Ie, सी ++ के साथ, अगर ऐसा वांछित हो, तो निष्पादन दक्षता के लिए कुछ प्रोग्रामर दक्षता का व्यापार करें। ऐसा करने के लिए काफी हद तक एक इंजीनियरिंग और पेट-महसूस करने का निर्णय है, क्योंकि व्यवहार में केवल लाभ, लागत नहीं, आसानी से अनुमान लगाया जा सकता है और मापा जाता है।


क्या सी + + अपवाद फेंकने के निष्पादन के कोई भी उपाय हैं?

हां, अंतरराष्ट्रीय सी ++ मानकीकरण समिति ने सी ++ प्रदर्शन, टीआर 18015 पर तकनीकी रिपोर्ट प्रकाशित की है।


इसका क्या अर्थ है कि अपवाद "धीमी" हैं?

मुख्य रूप से इसका मतलब है कि int की खोज के कारण throw एक बहुत लंबे समय का समय ले सकता है, जैसे कि एक int असाइनमेंट।

TR18015 के अपने अनुभाग 5.4 में चर्चा "अपवाद" दो प्रमुख अपवाद हैंडलिंग क्रियान्वयन रणनीतियां हैं,

  • जिस दृष्टिकोण से प्रत्येक try -ब्लॉक गतिशील रूप से अपवाद को पकड़ने के लिए सेट करता है, ताकि अपवाद फेंकने पर संचालक की डायनेमिक श्रृंखला की खोज की जाती है, और

  • जिस तरीके से कंपाइलर स्थैतिक लुक-अप टेबल उत्पन्न करता है, जिसका उपयोग फेंका गया अपवाद के लिए हेन्डलर को निर्धारित करने के लिए किया जाता है।

पहली बहुत लचीली और सामान्य दृष्टिकोण लगभग 32-बिट विंडोज में मजबूर है, जबकि 64-बिट भूमि में और * निकस-भूमि में दूसरा सबसे अधिक कुशल दृष्टिकोण आमतौर पर प्रयोग किया जाता है।

साथ ही उस रिपोर्ट की चर्चा भी की जाती है, प्रत्येक दृष्टिकोण के लिए तीन मुख्य क्षेत्र हैं जहां कार्यकुशलता पर अपवाद से निपटने का प्रभाव होता है:

  • try ब्लाकों,

  • नियमित कार्यों (अनुकूलन के अवसर), और

  • throw एक्सप्रेसन

मुख्य रूप से, डायनेमिक हैंडलर दृष्टिकोण (32-बिट विंडोज) अपवाद हैंडलिंग का try ब्लॉकों पर एक प्रभाव है, ज्यादातर भाषा की परवाह किए बिना (क्योंकि यह विंडोज़ ' स्ट्रक्चर्ड अपवाद हैंडलिंग स्कीम द्वारा मजबूर है), जबकि स्थैतिक तालिका का दृष्टिकोण लगभग शून्य लागत है try ब्लाकों इस पर चर्चा करने से बहुत अधिक स्थान और शोध होगा जो SO उत्तर के लिए व्यावहारिक है। इसलिए, विवरण के लिए रिपोर्ट देखें

दुर्भाग्य से, 2006 से रिपोर्ट, पहले से ही 2012 के अंत तक थोड़ा सा है, और जहाँ तक मुझे पता है कि कुछ भी तुलनीय नहीं है जो कि नया है

एक अन्य महत्वपूर्ण परिप्रेक्ष्य यह है कि प्रदर्शन पर अपवादों के उपयोग के प्रभाव, सहायक भाषा सुविधाओं की पृथक दक्षता से बहुत अलग है, क्योंकि रिपोर्ट नोट्स के रूप में,

"अपवाद निपटने पर विचार करते समय, यह त्रुटियों से निपटने के वैकल्पिक तरीकों के विपरीत होना चाहिए।"

उदाहरण के लिए:

  • विभिन्न प्रोग्रामिंग शैलियों (शुद्धता) के कारण रखरखाव लागत

  • निरर्थक कॉल साइट if असफलता बनाम बनाम मध्यवर्ती try

  • कैशिंग के मुद्दे (जैसे छोटा कोड कैश में फिट हो सकता है)

रिपोर्ट में पहलुओं की एक अलग सूची है, लेकिन वैसे भी निष्पादन दक्षता के बारे में कठिन तथ्यों को प्राप्त करने का एकमात्र व्यावहारिक तरीका संभवतः अपवाद का उपयोग करते हुए एक ही कार्यक्रम को लागू करना है, अपवादों का उपयोग नहीं करना, विकास समय पर निर्धारित कैप के भीतर और डेवलपर्स के साथ प्रत्येक तरीके से परिचित, और फिर उपाय।


अपवादों के ओवरहेड से बचने का एक अच्छा तरीका क्या है?

शुद्धता लगभग हमेशा कुशलता कुशलता है

अपवादों के बिना, निम्नलिखित आसानी से हो सकते हैं:

  1. कुछ कोड पी एक संसाधन प्राप्त करने या कुछ जानकारी की गणना करने के लिए है

  2. कॉलिंग कोड सी को सफलता / विफलता की जांच होनी चाहिए, लेकिन नहीं।

  3. गैर-विद्यमान संसाधन या अमान्य सूचना का उपयोग सी के निम्नलिखित कोड में किया जाता है, जिसके कारण सामान्य मेहेम होता है।

मुख्य समस्या पॉइंट (2) है, जहां सामान्य वापसी कोड योजना के साथ कॉलिंग कोड सी को चेक करने के लिए मजबूर नहीं किया जाता है।

ऐसे दो मुख्य दृष्टिकोण हैं जो इस तरह की जांच कर रहे हैं:

  • जहां पी सीधे विफल हो जाती है जब यह विफल हो जाता है

  • जहां पी किसी वस्तु को वापस लौटाता है, जिसकी सी को उसके मुख्य मूल्य (अन्यथा कोई अपवाद या समाप्ति) का उपयोग करने से पहले निरीक्षण करना पड़ता है।

दूसरा दृष्टिकोण था, एएएएआईआईके, जिसे पहली बार बार्टन और नेकमान ने अपनी पुस्तक में * वैज्ञानिक और इंजीनियरिंग सी ++: उन्नत तकनीक और उदाहरणों के साथ एक परिचय में वर्णित किया, जहां उन्होंने एक "संभव" कार्य परिणाम के लिए Fallow नामक एक कक्षा की शुरुआत की optional नामक एक समान वर्ग अब बूस्ट लाइब्रेरी द्वारा पेश किया गया है। और आप आसानी से Optional क्लास को लागू कर सकते हैं, गैर-पीओडी परिणाम के मामले में मान वाहक के रूप में एक std::vector का उपयोग कर।

पहले दृष्टिकोण के साथ कॉलिंग कोड सी के पास अपवाद हैंडलिंग तकनीक का उपयोग करने के लिए कोई विकल्प नहीं है। दूसरे दृष्टिकोण के साथ, हालांकि, कॉलिंग कोड सी खुद तय कर सकता है कि क्या करना है, if जांच की जा रही है या सामान्य अपवाद हैंडलिंग इस प्रकार, दूसरा दृष्टिकोण प्रोग्रामर बनाम निष्पादन समय दक्षता व्यापार-बंद करने का समर्थन करता है।


अपवाद के प्रदर्शन पर विभिन्न सी ++ मानकों का क्या प्रभाव है?

"मुझे यह जानना है कि यह अभी भी C ++ 98 के लिए सही है"

सी ++ 98 पहला सी ++ मानक था अपवादों के लिए अपवाद वर्गों की एक मानक पदानुक्रम (दुर्भाग्य से अपूर्ण) शुरू किया गया था। प्रदर्शन पर मुख्य प्रभाव अपवाद विनिर्देशों (सी +11 11 में हटा दिया) की संभावना थी, हालांकि मुख्य विंडोज सी ++ कंपाइलर विज़ुअल सी ++ द्वारा पूरी तरह कार्यान्वित नहीं किया गया था: विजुअल सी ++ सी + + 98 अपवाद विनिर्देश वाक्यविन्यास स्वीकार करता है, लेकिन सिर्फ उपेक्षा करता है अपवाद विनिर्देश

सी ++ 03 सी ++ 98 का ​​सिर्फ एक तकनीकी पुष्टिकरण था। सी ++ 03 में केवल सचमुच नया मूल्य प्रारंभिकता था। जो अपवादों के साथ कुछ नहीं करना है

C ++ 11 मानक सामान्य अपवाद विनिर्देशों के साथ निकाल दिया गया था, और noexcept कीवर्ड के साथ बदल दिया गया था।

सी ++ 11 मानक ने अपवादों को भंडारण और पुनर्स्थापित करने के लिए समर्थन भी जोड़ा, जो सी भाषा कॉलबैक में सी + + अपवादों को प्रचार करने के लिए बहुत अच्छा है। यह समर्थन प्रभावी ढंग से सीमित करता है कि वर्तमान अपवाद कैसे संग्रहीत किया जा सकता है। हालांकि, जहां तक ​​मुझे पता है कि प्रदर्शन पर कोई प्रभाव नहीं पड़ता है, उस डिग्री को छोड़कर, जो कि नए कोड अपवाद से निपटने में सी भाषा कॉलबैक के दोनों किनारों पर अधिक आसानी से उपयोग किया जा सकता है।

यह संकलक पर निर्भर करता है।

उदाहरण के लिए जीसीसी, अपवादों को संभालने में बहुत खराब प्रदर्शन करने के लिए जाना जाता था, लेकिन यह पिछले कुछ सालों में काफी बेहतर रहा है।

लेकिन ध्यान दें कि अपवादों को संभालना चाहिए – जैसा कि नाम कहते हैं – आपके सॉफ़्टवेयर डिज़ाइन में नियम के बजाय अपवाद होना चाहिए जब आपके पास एक ऐसा एप्लिकेशन होता है जो प्रति सेकंड इतने सारे अपवाद फेंकता है कि यह प्रदर्शन को प्रभावित करता है और यह अभी भी सामान्य ऑपरेशन माना जाता है, तो आपको इसके बजाय चीजों को अलग ढंग से करने के बारे में सोचना चाहिए।

अपवाद एक शानदार तरीका है कि कोड को सभी तरह से त्रुटि से निपटने के तरीके से अधिक पठनीय बनाया जा सकता है, लेकिन जैसे ही वे सामान्य कार्यक्रम के प्रवाह का हिस्सा बन जाते हैं, वे वास्तव में अनुसरण करना कठिन हो जाते हैं याद रखें कि एक throw छिपाने में काफी goto catch

सिल्लो की तरह इसके कार्यान्वयन पर निर्भर है, लेकिन सामान्य अपवादों में किसी भी कार्यान्वयन के लिए धीमा माना जाता है और प्रदर्शन गहन कोड में उपयोग नहीं किया जाना चाहिए।

संपादित करें: मैं यह नहीं कह रहा हूं कि उनका उपयोग बिल्कुल भी न करें, लेकिन प्रदर्शन गहन कोड के लिए उनसे बचने के लिए सबसे अच्छा है

हां, लेकिन इससे कोई फर्क नहीं पड़ता क्यूं कर?
इसे पढ़ें:
https://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx

असल में यह कहता है कि एलेक्जेंडरस्को जैसे अपवादों का उपयोग (50x मंदी की वजह से है क्योंकि वे else रूप में catch else ) सिर्फ गलत है पीपीएल के लिए कहा जा रहा है कि ऐसा करना पसंद है कि मैं सी + + 22 🙂 इच्छा कुछ जैसे जोड़ना होगा:
(ध्यान दें कि मूल भाषा होना चाहिए क्योंकि यह मूल रूप से मौजूदा एक से कंपाइलर उत्पन्न कोड है)

 result = attempt<lexical_cast<int>>("12345"); //lexical_cast is boost function, 'attempt' //... is the language construct that pretty much generates function from lexical_cast, generated function is the same as the original one except that fact that throws are replaced by return(and exception type that was in place of the return is placed in a result, but NO exception is thrown)... //... By default std::exception is replaced, ofc precise configuration is possible if (result) { int x = result.get(); // or result.result; } else { // even possible to see what is the exception that would have happened in original function switch (result.exception_type()) //... } 

पीएस यह भी ध्यान रखता है कि अपवाद तब भी धीमा है … यदि आप निष्पादन के दौरान कोड के उस हिस्से में बहुत समय खर्च न करते हैं तो यह एक समस्या नहीं है … उदाहरण के लिए यदि फ्लोट डिवीज़न धीमा है और आप इसे 4x बनाते हैं तेजी से कोई फर्क नहीं पड़ता अगर आप अपने समय का 0.3% एफपी विभाजन करते हैं …