2011-10-25 14 views
6

मैं सोच रहा था कि कैसे computationally महंगा जावा में instanceof ऑपरेटर उपयोग कर रहा है और पता करने के लिए अगर कोई बेहतर विकल्प उपलब्ध हैं चाहता थाजटिलता

+3

क्या कोई विकल्प है जो आपको करने की आवश्यकता पर निर्भर करता है ... –

उत्तर

9

विकल्प instanceof उपयोग करने से बचें और अपनी कक्षाओं ठीक से डिजाइन (OO में करने के लिए है समझ)।

instanceof ऑपरेटर के पास बाइट कोड निर्देश "instanceof" संबंधित है, शायद अधिक प्रदर्शन करने वाला दृष्टिकोण नहीं होगा; लेकिन यह भी वास्तविक जेवीएम अनुकूलित करने पर निर्भर करता है।

+5

यह एक उत्तर से अधिक टिप्पणी है। सवाल अनिवार्य रूप से है, "एक्स करने के लिए (जहां एक्स अस्थिर है) मुझे वाई करना होगा; वाई कितनी तेज़ है और क्या कोई विकल्प है?" आप बिल्कुल एक्स नहीं कर रहे हैं, जो ओपी के बिंदु को संबोधित नहीं कर रहा है। –

+1

@ माइकलएमसीगोवन: मेरे अनुभव से 'exampleof' अक्सर खराब डिजाइन से संबंधित है। मेरे लिए, इसका उपयोग नहीं करना सबसे अच्छा विकल्प है। और यदि आप इसका उपयोग नहीं कर रहे हैं, तो आपको इसके प्रदर्शन के बारे में चिंतित होने की आवश्यकता नहीं है। – jeha

+0

मैं पूरी तरह से सहमत हूं कि यह * अक्सर * खराब डिजाइन से संबंधित है। हालांकि, इसका मतलब यह नहीं है कि यह हमेशा मामला है, और कभी-कभी विभिन्न कारणों से एक खराब डिजाइन के साथ फंस जाता है। –

2

आप अगर वस्तु एक निश्चित वर्ग का एक उदाहरण है जाँच करना चाहते हैं (लेकिन अगर यह extends या यह implements), हो सकता है == साथ वर्गों की तुलना में तेजी से होगा:

o.getClass() == YourClass.class 

अन्यथा के बाद से instanceof कीवर्ड इस विशेष उद्देश्य के लिए बनाया गया है मैं नहीं दिख रहा है कि कैसे आप कभी भी बेहतर ..

+1

मुझे नहीं लगता कि यह तेज़ है, क्योंकि 'रेफ उदाहरण क्लास' सीधे 'exampleof' बाइटकोड ऑपरेशन में मैप किया गया है। आपका दृष्टिकोण विधि कॉल 'getClass' जोड़ता है। –

+0

तुलना करें कि आप 'getClass' के साथ प्रयास कर रहे हैं, यह जांचने का प्रयास करते समय काम नहीं करेगा कि ऑब्जेक्ट एक निश्चित सबक्लास से संबंधित है या नहीं। उदाहरण के लिए, यदि आपके पास 'इनपुटस्ट्रीम रीडर' का विस्तार करने वाला 'फ़ाइल रीडर' है जो बदले में 'रीडर' को बढ़ाता/लागू करता है, तो 'नया फ़ाइल रीडर' के साथ तत्काल ऑब्जेक्ट पर 'getClass' को कॉल करने से' फ़ाइलरडर 'वर्ग से कुछ और नहीं मिलेगा, और इसलिए ' o.getClass() == रीडर' या 'o.getClass() == इनपुटस्ट्रीम रीडर 'दोनों' झूठी 'का मूल्यांकन करेंगे। दूसरी तरफ, 'उदाहरण', सभी तीन वर्ग मामलों में 'सत्य' पैदा करेगा। – amn

2

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

यदि सब आप कर रहे हैं इस तरह कोड है:

if (something instanceof MyClass) { 
    MyClass mySomething = (MyClass) something; 
    //... 
} else { 
    //exceptional case 
} 

तो यह अपने "असाधारण मामला" होने के लिए पहले डाली कोशिश करने के लिए, और अनुमति ClassCastException संभव हो सकता है:

try { 
    MyClass mySomething = (MyClass) something; 
} catch (ClassCastException cce) { 
    //exceptional case 
} 

अब, जबकि यह समयपूर्व हो सकता है अनुकूलन, यह आपके डिज़ाइन पर पुनर्विचार करने के लिए समयपूर्व नहीं होगा। instanceof का ओवरयूज एक डिजाइन गंध है। आम तौर पर, आपको जेनेरिक और बहुरूपता का उपयोग उन तरीकों से करना चाहिए जो आप instanceof (और वास्तव में कास्टिंग) का उपयोग करते हैं, लगभग शून्य तक।

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

  2. आप पाते हैं अपने आप को "जानने" है कि एक वस्तु एक खास प्रकार के है, लेकिन आप कुछ कदम है कि इस तथ्य के बारे संकलक ट्रैक खो (जैसे आप इसे एक कच्चे List में डाल दिया) बनाता किया है, तो यह हो सकता है जनरेशन के लिए एक उम्मीदवार।

7

instanceof बहुत तेज़ तेज़ है। हालांकि, यह आमतौर पर एक खराब विचार डिजाइन का एक लक्षण है।

इसमें एक (सफल) कलाकार के समान प्रदर्शन होगा, क्योंकि यह वही काम कर रहा है। दरअसल, यह कार्य लगभग "आभासी" विधि कॉल के बराबर है।

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

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