2012-06-11 13 views
8

मुझे पता है कि एक प्रोग्राम को निष्पादित करते समय कैच ब्लॉक में जाने के लिए कुछ महत्व लागत होती है, हालांकि, मैं सोच रहा था कि कोशिश करने में {{ब्लॉक ब्लॉक का कोई प्रभाव पड़ा है, इसलिए मैंने जवाब ढूंढना शुरू कर दिया Google में कई राय के साथ, लेकिन बिल्कुल कोई बेंचमार्किंग नहीं। कुछ जवाब मैंने पाया थे:जावा का बेंचमार्क आज़माएं/कैच ब्लॉक

  1. Java try/catch performance, is it recommended to keep what is inside the try clause to a minimum?
  2. Try Catch Performance Java
  3. Java try catch blocks

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

यहां मैंने जो किया है। मैं इस प्रारूप के साथ एक csv फ़ाइल है:

host;ip;number;date;status;email;uid;name;lastname;promo_code;

जहां स्थिति के बाद सब कुछ वैकल्पिक है और यहां तक ​​कि इसी की ज़रूरत नहीं होगी; , इसलिए यह देखने के लिए कि क्या मूल्य है, वहां सत्यापन करने के लिए एक सत्यापन को पार करना होगा, यहां वह जगह है जहां मेरे दिमाग में कोशिश/पकड़ मुद्दा आया था।

StringTokenizer st=new StringTokenizer(line,";"); 
String host = st.nextToken(); 
String ip = st.nextToken(); 
String number = st.nextToken(); 
String date = st.nextToken(); 
String status = st.nextToken();        
String email = ""; 
try{ 
    email = st.nextToken(); 
}catch(NoSuchElementException e){ 
    email = ""; 
} 

और यह दोहराता है क्या यह uid, नाम, उपनाम और promo_code के साथ ईमेल के लिए किया जाता है:

वर्तमान कोड है कि मैं अपनी कंपनी में विरासत में मिला करता है।

और मैं करने के लिए सब कुछ बदल दिया है:

if(st.hasMoreTokens()){ 
    email = st.nextToken(); 
} 

और वास्तव में यह तेजी से प्रदर्शन करती है। एक फ़ाइल को पार्स करते समय जिसमें वैकल्पिक कॉलम नहीं होते हैं। यहाँ औसत समय है:

--- Trying:122 milliseconds 
--- Checking:33 milliseconds 

तथापि, यहाँ क्या मुझे और कारण मैं पूछ रहा हूँ उलझन में है: सीएसवी के सभी 8000 लाइनों में वैकल्पिक कॉलम के लिए मूल्यों के साथ उदाहरण चल रहा है, अगर() संस्करण अभी भी कोशिश/पकड़ संस्करण से बेहतर प्रदर्शन करता है, इसलिए मेरा प्रश्न

क्या वास्तव में प्रयास ब्लॉक का मेरे कोड पर कोई प्रदर्शन प्रभाव नहीं पड़ता है?

इस उदाहरण के लिए औसत समय है:

--- Trying:105 milliseconds 
--- Checking:43 milliseconds 

किसी व्याख्या कर सकते हैं यहाँ क्या हो रहा है?

धन्यवाद एक बहुत

+0

हर बार स्थिति की जांच करने से कार्यक्रम धीमा हो जाता है। एकाधिक IF कथन होने का अच्छा विचार नहीं है। आपकी कंपनी दृष्टिकोण समझ में आता है। जब भी कोई त्रुटि उठाई जाती है, तो आप यह देखने के लिए पकड़ ब्लॉक कर सकते हैं कि यह क्या है। –

+0

मैं इसे दूसरा नहीं करूंगा। अपने मामले में, ईमेल वैकल्पिक है, इसलिए 'st' और टोकन नहीं होने वाला असाधारण मामला नहीं है, लेकिन अक्सर ऐसा हो सकता है। यहां एक अपवाद का उपयोग करना कोई अच्छी शैली नहीं है। – gexicide

+0

न केवल अक्सर होगा, डिफ़ॉल्ट व्यवहार है। हमें केवल कई छोटे अवसरों में वैकल्पिक फ़ील्ड मिलेगा – hectorg87

उत्तर

10

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

फिर भी, नियमित नियंत्रण प्रवाह के लिए अपवादों का उपयोग करना अच्छा अभ्यास नहीं है।

आपका कोड तेज़ी से प्रदर्शन करने का कारण शायद यह है कि पकड़ना इतना महंगा है कि यह चेक को सरल प्रयास से बदलकर बचाया गया समय से अधिक है।

पकड़ने की कोशिश करें कोड में तेज़ी से ट्रिगर किया जा सकता है, उदाहरण के लिए, यदि आप 10000 बार कोशिश करते हैं लेकिन केवल एक बार पकड़ते हैं, तो प्रयास विधि if-check से तेज होगी। फिर भी, यह कोई अच्छी शैली नहीं है और अधिक टोकन के लिए स्पष्ट रूप से जांचने का आपका तरीका पसंद किया जाना है।

+0

धन्यवाद, मैं वास्तव में इसे समझता हूं, हालांकि कोड मैंने कोशिश की है अन्यथा, यह पसंद करता है {} यह इसे रनटाइम पर कुछ ओवरहेड दे रहा है, और यही मेरा सवाल है। मैं टेस्ट कोड कहीं भी पेस्ट कर सकता हूं ताकि आप इसे आजमा सकें और खुद के लिए देख सकें। – hectorg87

+0

ठीक है, मैं देखता हूं। खैर, समस्या यह हो सकती है कि कोशिश को अनुकूलित करना कठिन हो। हालांकि, प्रदर्शन प्रभाव वैसे भी उपेक्षित है। अंगूठे के नियम के रूप में, आपको ऑप्टिमाइज़ेशन कारणों के प्रयास/प्रयास के साथ आदान-प्रदान पर विचार नहीं करना चाहिए। असाधारण व्यवहार के लिए कोशिश करें/पकड़ें और नियमित नियंत्रण प्रवाह के लिए। बाकी सब कुछ एक हैक है। – gexicide

+0

मेरे प्रश्न में दिए गए समय 1) हैं जब कैच ब्लॉक ALWAYS (8000 बार * 5 कॉलम) में प्रवेश करते हैं और 2) पकड़ ब्लॉक में प्रवेश नहीं करते हैं क्योंकि वैकल्पिक कॉलम हमेशा – hectorg87

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