2011-02-16 23 views
10

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

सबसे पहले इस सी # पर एक नज़र डालें:

int simpleSimon, cautiousCarol, dangerousDave; 

try 
{ 
    simpleSimon = int.Parse("fail"); 
} 
catch 
{ 
    simpleSimon = 1; 
} 

try 
{ 
    cautiousCarol = int.Parse("1"); 
} 
catch 
{ 
    cautiousCarol = 1; 
} 

dangerousDave = int.Parse("1"); 

मुझे विश्वास है कि डेव कोड सबसे तेजी से/सबसे कारगर हो जाएगा हूँ; जबकि साइमन को अपवाद फेंकने के लिए एक बड़ा जुर्माना लगाया जाएगा।

लेकिन कैरोल के बारे में क्या? जैसे ही उसने कोई अपवाद नहीं फेंक दिया वह जुर्माना लगाती है? यदि हां, तो किस तरह और कितना बड़ा? (प्रदर्शन जुर्माना या अतिरिक्त स्मृति उपयोग या कुछ और?)

+4

परिवर्तनीय नामों के लिए +1! – JonH

+1

संभावित डुप्लिकेट [सी # में 'कोशिश' की प्रदर्शन लागत (http://stackoverflow.com/questions/867017/performance-cost-of-try-in-c) –

उत्तर

6

यह एक जेआईटी कार्यान्वयन विस्तार है। एक्स 86 जिटर को स्टैक फ्रेम में 16 बाइट्स सेट करना होगा ताकि सीएलआर को अपवाद फेंकने के मामले में उचित पकड़ ब्लॉक ढूंढने में मदद मिल सके। इसमें लगभग 3 नैनोसेकंड लेना चाहिए। X64 जिटर के लिए बिल्कुल कोई काम नहीं, अपवाद फ़िल्टरिंग विंडोज के 64-बिट संस्करण (स्टैक आधारित के बजाय टेबल आधारित) पर अलग-अलग लागू होती है। अतिरिक्त मेमोरी आवश्यक समकक्ष (कोड बनाम तालिका डेटा) के बारे में है।

इनमें से कोई भी इस तरह के कोड के साथ कोई फर्क नहीं पड़ता है, एक स्ट्रिंग को एक पूर्णांक में कनवर्ट करना एक I/O ऑपरेशन है। डेटा को पहली जगह में प्राप्त करने की लागत आपके द्वारा किए गए किसी भी पार्सिंग की तुलना में परिमाण का एक आसान 3 या 4 ऑर्डर है। और यदि आप डेटा के स्रोत पर भरोसा नहीं करते हैं तो आप निश्चित रूप से TryParse() का उपयोग करेंगे। एक अपवाद प्रसंस्करण काफी महंगा है।

8

Carol के लिए कोई महत्वपूर्ण जुर्माना नहीं है। यदि आवश्यक हो तो केवल कुछ कूद पंजीकृत और निष्पादित किए जाएंगे।

एक संकेत के रूप में, इस तरह की स्थितियों से बचने के लिए int.TryParse(...) का उपयोग करें।

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