2011-11-24 12 views
6

चेक करने के बजाय अपवाद को पकड़ते समय कितना समय (नैनोसेकंड में) प्रयास करने की कोशिश करता है (मानते हुए संदेश में लुकअप के लिए हैश मैप प्रकार का प्रदर्शन है)?कैच प्रदर्शन जावा का प्रयास करें

try { 
     timestamp = message.getLongField(MessageField.TIMESTAMP); 
    } catch (MissingDataException e) { 
     //Not all messages contain this field 
    } 

बनाम

if (message.contains(MessageField.TIMESTAMP)) 
    timestamp = message.getLongField(MessageField.TIMESTAMP); 
+0

यह जेवीएम, अंतर्निहित हार्डवेयर आदि के बहुत सारे आधार को बदलने जा रहा है। क्या आपने इसे स्वयं मापने की कोशिश की है? – Sean

+1

क्या यह एक असाधारण स्थिति है? क्या आपको इसे एक त्रुटि के रूप में लॉग इन करने की आवश्यकता है? क्या यह कोड लूप में चलता है? –

+0

पॉसिलबे डुप्लिकेट: http://stackoverflow.com/questions/4280831/java-try-catch-performance-is-it-recommended-to-keep-what-is-inside-the-try-cla और http: // stackoverflow.com/questions/5158665/java-try-catch-blocks –

उत्तर

22

संक्षेप में, चेक रास्ता तेज है। आपको चेक का उपयोग करना चाहिए क्योंकि:

  • अपवाद विस्तृत हैं! एक स्टैक ट्रेस बनाया जाना चाहिए (यदि इस्तेमाल किया गया है, उदाहरण के लिए लॉग इत्यादि) और विशेष प्रवाह नियंत्रण
  • अपवादों को प्रवाह नियंत्रण के लिए उपयोग नहीं किया जाना चाहिए - अपवाद "असाधारण"
  • अपवाद हैं कोड " इस स्थिति को संभाल नहीं कर सकते हैं और मैं दे रहा हूँ ... आप इसके साथ सौदा! ", लेकिन यहाँ आप इसे संभाल कर सकते हैं ... इसलिए इसे संभाल
+0

कुछ परिस्थितियों में अपवाद को अनुकूलित किया जा सकता है, इसलिए यह सभी मामलों में जरूरी नहीं है। –

+2

+1: स्टैक ट्रेस पूरी तरह से तब तक नहीं बनाया जाता है जब तक इसका उपयोग नहीं किया जाता है (जैसा कि अधिकांश अपवादों की आवश्यकता नहीं है) सभी समान अपवाद महंगे नहीं हैं बल्कि असाधारण स्थितियों के लिए होना चाहिए। –

+0

@ पीटर Lawrey धन्यवाद - मुझे पता नहीं था कि इस्तेमाल किए जाने वाले स्टैकट्रिस के बारे में नहीं पता था जब तक – Bohemian

3

जवाब "बहुत लंबे समय तक" है। स्टैकट्रैक बनाने के समय के कारण चेक की तुलना में अपवाद धीमे होते हैं।

प्रोग्राम प्रवाह को नियंत्रित करने के अपवादों का उपयोग करते हुए एक सामान्य बिंदु के रूप में यह एक बुरा विचार है क्योंकि यह कोड को अपनाना है। हमेशा "असाधारण" चीजें होने पर जांच करें और अपवाद छोड़ दें।

+0

इसे मापना चाहते हैं ... –

+0

कुछ परिस्थितियों में अपवाद को अनुकूलित किया जा सकता है, इसलिए यह सभी मामलों में आवश्यक रूप से धीमा नहीं है। –

3

एक और जवाब है," कौन परवाह करता है! " । यह गलत है!

किसी भी मामले में, यदि आप बेंचमार्क करना चाहते हैं यह, https://github.com/google/caliper

+0

कोई भी ऐसा नहीं करता? मुझे लगता है कि कोशिश की लागत मामूली है, फेंकने की लागत (ई) ... पकड़ (अपवाद ई) {} काफी महंगी है, इसलिए आप केवल कमजोर (यानी असाधारण) स्थितियों के निर्माण का उपयोग करना चाहते हैं। लेकिन एक "कोशिश" करने के सापेक्ष प्रदर्शन करने के लिए कैसे एक परीक्षण (अगर (x)), (i + = j) जोड़ें, आदि। मैं इसे मैप 1 से 5x में कहीं सोचता हूं कि अगर लागू किया गया तो राशि बढ़ जाती है। – peterk

+0

कैलिपर अभी भी बनाए रखा है? मेरे मामले में यह 'NoSuchMethodError' – Joel

+0

फेंकता है ऐसा लगता है कि यह गिथब में स्थानांतरित हो गया है। लिंक अपडेट किया गया – alex

1

इस यों करना चाहते हैं का उपयोग करें ...

यह सामान्य रूप में अंदाजा लगाना सचमुच असंभव है। नैनोसेकंड में नहीं ... क्योंकि यह निष्पादन मंच पर निर्भर करता है। और प्रतिशत शर्तों में भी नहीं।

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

लेकिन दूसरा पहलू JIT कम्पाइलर के लिए गुंजाइश को भारी अनुकूलन अपवाद से संबंधित कोड बशर्ते वह निर्धारित कर सकते हैं कि उस के लिए स्टैक ट्रेस और अपवाद एक खास बिंदु पर फेंक दिया कभी नहीं होने जा रहा है है कि वहाँ है उपयोग किया गया।


तुम सच में कुछ (IMO, व्यर्थ और काफी हद तक व्यर्थ) संख्या चाहते हैं, आप अपने खुद के बेंच मार्किंग करने की आवश्यकता होगी। सौभाग्य।

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