2011-01-03 18 views
6

कुछ पुराने कोड है कि फेंकने है और खाली पर गलती से कुछ डाली अपवाद (यात्रा प्रति के बारे में 20 :()सी # कास्ट अपवाद

क्या होगा अगर किसी भी बढ़ रहा है प्रदर्शन हिट इस की वजह से ले जा रहे थे? मैं के बारे में चिंतित होना चाहिए इस या बस ट्राई/कैच

हैरानी की बात है वास्तव में के साथ सी # अपवाद के प्रदर्शन के विषय पर जानकारी का अभाव।

धन्यवाद, तुम्हारा से।

+0

विधि के सार के साथ एक समस्या का पता लगाना समाप्त हो गया और 10000 वस्तुओं से 3 मिलीसेकंड तक 3.8 सेकेंड से चलाए गए कोड की दो पंक्तियों में पकड़ने की कोशिश करने के लिए स्पष्ट स्थानों के 30 लाइन राक्षस को बदल दिया। सभी को धन्यवाद! –

उत्तर

9

अपवाद आप कोड के सबसे औसत लाइनों की तुलना में अधिक धीमा करने के लिए जा रहे हैं। कास्टिंग करने और फिर अपवाद को पकड़ने के बजाय, इसके बजाय एक चेक करें। उदाहरण

खराब

myType foo = (myType)obj; 
foo.ExecuteOperation(); 

अच्छा

myType foo = obj as myType; 
if (foo != null) 
{ 
    foo.ExecuteOperation(); 
} 
0

अपवाद महंगा, प्रदर्शन के लिहाज से कर रहे हैं में भूमि के ऊपर है। अंतिम समय मैं मापता हूँ इन्हें ठीक किया गया, वे प्रत्येक अपवाद को फेंकने और पकड़ने के लिए को पूर्ण मिलीसेकंड के बारे में ले रहे थे।

प्रवाह नियंत्रण तंत्र के रूप में अपवादों का उपयोग करने से बचें।

+0

क्या वह अपवाद को फेंकने से अपवाद को संभाल नहीं लेना चाहिए, वह इसे सुंदर तरीके से संभाल सकता है। कोई भी अपवाद जिसे वह आसानी से पकड़ नहीं सकता है वह अपवाद का प्रकार है जिसे आप फेंकना चाहते हैं, अगर वह सावधान रहें तो उन्हें निश्चित रूप से नहीं होना चाहिए। –

-1

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

शायद डालने की कोशिश करने से पहले आप कुछ if खंडों के साथ देख सकते हैं यदि आप कास्ट कर सकते हैं।

+0

अपवाद महंगे हैं। सामान्य ऑपरेशन के लिए उनका उपयोग करना बुरा अभ्यास है। –

+0

मैंने कभी नहीं कहा है कि वे महंगी नहीं हैं। यदि आप मेरी पोस्ट पढ़ते हैं तो मैंने लिखा है कि वह केवल तभी उपयोग कर सकता है जब वह प्रदर्शन समस्याओं को न पकड़ें या अगर यह एल्गोरिदम लिखने का एकमात्र तरीका है। –

+0

यहां ऑपरेटिव अभिव्यक्ति है "अगर ... यह एकमात्र तरीका है जिसे आपको एल्गोरिदम करना है।" कभी-कभी, आपको नियम तोड़ना पड़ता है। यह बदसूरत नहीं है, लेकिन यह सच है। हालांकि मैं शायद TryParse का उपयोग करने के लिए ऐसे कोड को दोबारा प्रतिक्रिया दूंगा, सवाल अभी भी बना हुआ है: यदि यह विफल रहता है तो आप क्या करते हैं? –

0

जैसा कि अन्य लोगों ने उल्लेख किया है, फेंकने पर अपवाद महंगे हैं। कुछ मामलों में उन्हें टाला नहीं जा सकता है।

इस मामले में, ऐसा लगता है कि वे निश्चित रूप से हो सकते हैं।

मैं कास्ट से पहले as कीवर्ड का उपयोग करने का सुझाव दूंगा। यही कारण है कि आपको पता चलेगा कि कलाकारों सफल रहा या इस प्रकार अपवाद पूरी तरह से परहेज नहीं:

object someObject; 
SomeType typedObject; 

// fill someObject 

typedObject = someObject as SomeType; 

if(typedObject == null) 
{ 
    // Cast failed 
} 
+0

किसी को या तो 'अगर (x है टी) y = (टी) x; 'या' y = x टी के रूप में जोड़ना चाहिए; अगर (एक्स! = शून्य) '। पूर्व structs के साथ भी काम करता है। – Dykam

1

कि दो कारणों के लिए बुरा है के लिए।

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

यदि वे केवल try { } finally { } समूह हैं, तो यह सब अच्छा है - वहां कोई ओवरहेड नहीं है। हालांकि, try { } catch { } दोनों संभावित रूप से खतरनाक और संभावित रूप से धीमी है।http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx#Don%27tuseexceptionhandlingasmeansofreturninginformationfromamethod18

संपादित करें::

प्रलेखन का सवाल है, यह बहुत अच्छा है बस एहसास हुआ कि आपने कहा खाली अपवाद नहीं खाली अपवादों को पकड़ने को पकड़ने। किसी भी तरह से, जब तक आप आईओ से निपट नहीं रहे हैं, तो आप शायद प्रदर्शन के लिए ऐसा करने से बचना चाहते हैं।

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