2012-09-10 6 views
5

संभव डुप्लिकेट:
How slow are .NET exceptions?अपवाद हैंडलिंग। पकड़ने में कितना समय लगता है?

वहाँ एक अपवाद फेंकने के बाद उसे तुरंत पकड़ने के लिए एक ओवरहेड है?

void DoSomething(object basic) 
{ 
    try 
    { 
     if (basic == null) 
     { 
      _logger.WriteLog(new NullReferenceException("Any message"); 
      return; 
     } 
     else 
     { 
     ... 
     } 
    } 
    catch (Exception error) 
    { 
     _logger.WriteLog(error); 
    } 
} 

दूसरा टुकड़ा तेजी से होगा, या नहीं: इस

void DoSomething(object basic) 
{ 
    try 
    { 
     if (basic == null) 
     throw new NullReferenceException("Any message"); 
     else 
     { 
     //... 
     } 
    } 
    catch (Exception error) 
    { 
     _logger.WriteLog(error); 
    } 
} 

और इस (यहाँ हम फेंक नहीं है अपवाद) के बीच एक अंतर है?

मैं भी जानना चाहता हूं कि एक समाधान दूसरे से तेज क्यों है।

+0

(नया NullReferenceException ("कोई भी संदेश");) यह मेरा गलत प्रिंट है। –

+2

आप इसे ठीक करने के लिए हमेशा अपना प्रश्न संपादित कर सकते हैं ('संपादन' लिंक पर क्लिक करें) – dasblinkenlight

+0

यदि आप जानना चाहते हैं कि कौन सा तेज़ है, और आपके पास पहले से ही दो वैध कोड स्निपेट हैं, तो क्यों न केवल दोनों (कई बार बार) चलाएं अपने लिए बाहर? – Servy

उत्तर

4

अपवाद अन्य सभी प्रोग्राम प्रवाह की तुलना में धीमी है, लेकिन हद तक वे प्रदर्शन कारणों से परहेज किया जाना चाहिए नहीं। हालांकि, वे प्रोग्राम प्रवाह के लिए उपयोग नहीं किया जाना है। आपकी स्थिति में, आपके पास एक बहुत ही वैध विकल्प है जो अपवादों का उपयोग करने से बेहतर है। जब आप किसी परिस्थिति की भविष्यवाणी कर सकते हैं और बिना किसी अपवाद के इसे उचित तरीके से संभाल सकते हैं, तो हमेशा ऐसा करें। साथ ही, सुविधा के रूप में सामान्य प्रोग्राम प्रवाह में अपवादों का उपयोग न करें।

अपवादों का उपयोग करें जब आपके पास एक असाधारण असाधारण स्थिति है जिसे आप सीधे संभाल नहीं सकते हैं।

+0

धन्यवाद। प्रोजेक्ट में मैंने पाया पहला खंड और मैं, यह फेंकने के बिना बेहतर करना और यहां पूछना बेहतर है। –

+0

प्रोग्राम प्रवाह के अंत में प्रयास करने के बारे में आप क्या सोचते हैं, जब कोशिश की वापसी के ब्लॉक में, और आखिर में सामान्य कोड को अवरुद्ध करते हैं, जिसे हमेशा निष्पादित करना होगा, रखा गया है? –

+0

@DaniilGrankin, 'try'/'अंत में' कोड चलाने के लिए वास्तव में एक महत्वपूर्ण निर्माण है, आमतौर पर क्लीनअप कोड, चाहे यह कैसे उत्पन्न होता है (वापसी, गिरावट, या अपवाद से)। आम तौर पर केवल क्लीन-अप कोड को 'अंत में' चलाना चाहिए और आप यह सुनिश्चित करना चाहते हैं कि 'आखिरकार' बिल्कुल अपवाद नहीं फेंकता। उन चीजों को ध्यान में रखते हुए, हमेशा उचित होने पर 'try'/'अंत में' का उपयोग करें। –

0

मैं इकट्ठा करता हूं कि थ्रो को कोशिश/पकड़ने से बहुत अधिक ओवरहेड होता है। इसके द्वारा मेरा मतलब है कि कोशिश करने/पकड़ने के लिए थोड़ा ऊपर की ओर है, लेकिन वास्तव में एक अपवाद पकड़ने के बाद एक छोटा ओवरहेड होता है। कई कार्यक्रमों में, आपके द्वारा दिखाए गए दोनों विकल्प ठीक होंगे, लेकिन यदि आप वास्तव में अपना कोड प्रोफ़ाइल करने का प्रयास कर रहे हैं, तो यह फेंकने के बिना तेज़ होगा। लायक अन्य प्रश्न के एक जोड़े को देख:

Under C# how much of a performance hit is a try, throw and catch block

What is the real overhead of try/catch in C#?

0

इस मामले में मुझे लगता है कि दूसरी पसंद अधिक तेज़ है, लेकिन कहा गया है कि @ सैमुएल नेफ अपवाद बहुत धीमे हैं। हालांकि, जब मैं जॉन स्कीट अपवादों के बारे में आर्कटिकल पढ़ रहा था, तो मुझे क्रज़िट्टोफ कैवालिना: Design Guidelines Update: Exception Throwing. द्वारा एक दिलचस्प आर्कटिकल मिला, जो बताता है कि हमें अपवादों का उपयोग क्यों करना चाहिए और नहीं करना चाहिए। दरअसल इसे पढ़ने मैंने पाया एक महत्वपूर्ण बिंदु का कहना है:

1,2 अपवाद और प्रदर्शन:

एक आम अपवाद से संबंधित चिंता यह है कि कोड है कि नियमित रूप से विफल रहता है, के प्रदर्शन के लिए इस्तेमाल किया है, तो अपवाद हैं कार्यान्वयन अस्वीकार्य होगा। यह एक बहुत ही वैध चिंता है। जब कोई सदस्य अपवाद फेंकता है, तो इसका प्रदर्शन परिमाण धीमा हो सकता है। हालांकि, त्रुटि कोड का उपयोग करते हुए को अस्वीकार करने वाले अपवाद दिशानिर्देशों का सख्ती से पालन करते हुए अच्छा प्रदर्शन प्राप्त करना संभव है। ऐसा करने के लिए इस खंड में वर्णित दो पैटर्न का सुझाव देते हैं।

  • क्योंकि चिंता है कि अपवाद को नकारात्मक रूप से प्रदर्शन प्रभावित हो सकता का नहीं उपयोग त्रुटि कोड है।
संबंधित मुद्दे