मैं सोच रहा था कि कैसे computationally महंगा जावा में instanceof ऑपरेटर उपयोग कर रहा है और पता करने के लिए अगर कोई बेहतर विकल्प उपलब्ध हैं चाहता थाजटिलता
जटिलता
उत्तर
विकल्प instanceof
उपयोग करने से बचें और अपनी कक्षाओं ठीक से डिजाइन (OO में करने के लिए है समझ)।
instanceof
ऑपरेटर के पास बाइट कोड निर्देश "instanceof" संबंधित है, शायद अधिक प्रदर्शन करने वाला दृष्टिकोण नहीं होगा; लेकिन यह भी वास्तविक जेवीएम अनुकूलित करने पर निर्भर करता है।
यह एक उत्तर से अधिक टिप्पणी है। सवाल अनिवार्य रूप से है, "एक्स करने के लिए (जहां एक्स अस्थिर है) मुझे वाई करना होगा; वाई कितनी तेज़ है और क्या कोई विकल्प है?" आप बिल्कुल एक्स नहीं कर रहे हैं, जो ओपी के बिंदु को संबोधित नहीं कर रहा है। –
@ माइकलएमसीगोवन: मेरे अनुभव से 'exampleof' अक्सर खराब डिजाइन से संबंधित है। मेरे लिए, इसका उपयोग नहीं करना सबसे अच्छा विकल्प है। और यदि आप इसका उपयोग नहीं कर रहे हैं, तो आपको इसके प्रदर्शन के बारे में चिंतित होने की आवश्यकता नहीं है। – jeha
मैं पूरी तरह से सहमत हूं कि यह * अक्सर * खराब डिजाइन से संबंधित है। हालांकि, इसका मतलब यह नहीं है कि यह हमेशा मामला है, और कभी-कभी विभिन्न कारणों से एक खराब डिजाइन के साथ फंस जाता है। –
आप अगर वस्तु एक निश्चित वर्ग का एक उदाहरण है जाँच करना चाहते हैं (लेकिन अगर यह extends
या यह implements
), हो सकता है ==
साथ वर्गों की तुलना में तेजी से होगा:
o.getClass() == YourClass.class
अन्यथा के बाद से instanceof
कीवर्ड इस विशेष उद्देश्य के लिए बनाया गया है मैं नहीं दिख रहा है कि कैसे आप कभी भी बेहतर ..
मुझे नहीं लगता कि यह तेज़ है, क्योंकि 'रेफ उदाहरण क्लास' सीधे 'exampleof' बाइटकोड ऑपरेशन में मैप किया गया है। आपका दृष्टिकोण विधि कॉल 'getClass' जोड़ता है। –
तुलना करें कि आप 'getClass' के साथ प्रयास कर रहे हैं, यह जांचने का प्रयास करते समय काम नहीं करेगा कि ऑब्जेक्ट एक निश्चित सबक्लास से संबंधित है या नहीं। उदाहरण के लिए, यदि आपके पास 'इनपुटस्ट्रीम रीडर' का विस्तार करने वाला 'फ़ाइल रीडर' है जो बदले में 'रीडर' को बढ़ाता/लागू करता है, तो 'नया फ़ाइल रीडर' के साथ तत्काल ऑब्जेक्ट पर 'getClass' को कॉल करने से' फ़ाइलरडर 'वर्ग से कुछ और नहीं मिलेगा, और इसलिए ' o.getClass() == रीडर' या 'o.getClass() == इनपुटस्ट्रीम रीडर 'दोनों' झूठी 'का मूल्यांकन करेंगे। दूसरी तरफ, 'उदाहरण', सभी तीन वर्ग मामलों में 'सत्य' पैदा करेगा। – amn
कर सकता है मुझे लगता है आप वास्तव में अपने कोड प्रोफाइल और पाया कि 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
(और वास्तव में कास्टिंग) का उपयोग करते हैं, लगभग शून्य तक।
अलग कोड वस्तु के प्रकार के आधार चलाने किया जाना चाहिए, कि कोड वस्तु का एक उदाहरण विधि बनाने और विभिन्न प्रकार के एक इंटरफेस के अनुरूप होने पर विचार करें।
आप पाते हैं अपने आप को "जानने" है कि एक वस्तु एक खास प्रकार के है, लेकिन आप कुछ कदम है कि इस तथ्य के बारे संकलक ट्रैक खो (जैसे आप इसे एक कच्चे
List
में डाल दिया) बनाता किया है, तो यह हो सकता है जनरेशन के लिए एक उम्मीदवार।
instanceof
बहुत तेज़ तेज़ है। हालांकि, यह आमतौर पर एक खराब विचार डिजाइन का एक लक्षण है।
इसमें एक (सफल) कलाकार के समान प्रदर्शन होगा, क्योंकि यह वही काम कर रहा है। दरअसल, यह कार्य लगभग "आभासी" विधि कॉल के बराबर है।
सायन कार्यान्वयन पर: कक्षाओं के लिए, यह रनटाइम कक्षा प्राप्त करने और सुपरक्लास की जांच के लिए एक निश्चित ऑफ़सेट देखने की बात है (जब तक आपके पास हॉटस्पॉट के लिए आठ से अधिक कक्षाओं की विरासत श्रृंखला नहीं है) । इंटरफेस थोड़ा और मुश्किल हैं, लेकिन आमतौर पर कैश किए गए किसी विशेष रनटाइम क्लास के लिए पिछले दो उपयोग किए गए मामले होते हैं। तो यह भी तेज़ है।
- 1. चौराहे जटिलता
- 2. समय जटिलता
- 3. जटिलता गणना
- 4. समय जटिलता()
- 5. ऑब्जेक्ट.की() जटिलता?
- 6. समय जटिलता
- 7. समय जटिलता
- 8. समय जटिलता()
- 9. न्यूनतम जटिलता
- 10. डेटाबेस क्वेरी समय जटिलता
- 11. ओ (1) जटिलता
- 12. एल्गोरिदम का विश्लेषण (जटिलता)
- 13. 2^एन जटिलता एल्गोरिदम
- 14. ट्री जटिलता और खोज
- 15. ट्रीमैप - खोज समय जटिलता
- 16. ट्रिकी बिग-ओ जटिलता
- 17. चक्रवात जटिलता की गणना
- 18. एल्गोरिदम की जटिलता
- 19. समय जटिलता अजगर
- 20. सेट की जटिलता :: डालने
- 21. कोल्मोगोरोव जटिलता अनुमान एल्गोरिदम
- 22. random.sample की समय जटिलता
- 23. गैलप खोज समय जटिलता?
- 24. रिकर्सिव एल्गोरिदम की स्पेस जटिलता
- 25. OrderedDictionary की जटिलता क्या है?
- 26. मैट्रिक्स गुणा एल्गोरिदम समय जटिलता
- 27. सेट समय और गति जटिलता
- 28. प्राइम का एल्गोरिदम समय जटिलता
- 29. ल्यूसीन की खोज की जटिलता
- 30. हैश टेबल की समय जटिलता
क्या कोई विकल्प है जो आपको करने की आवश्यकता पर निर्भर करता है ... –