2012-09-20 9 views
9

संभव डुप्लिकेट:
Why are interface method invocations slower than concrete invocations?कौन सा तेज़, सार वर्ग या इंटरफ़ेस है?

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

निम्नलिखित के अनुसार सार वर्ग तेजी से है लेकिन इसके लिए कोई उचित कारण नहीं है। http://www.codeproject.com/Articles/11155/Abstract-Class-versus-Interface

उत्तर

9

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

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

लेकिन जैसा कि मैंने कहा, मुझे संकलक में क्या होता है इसके बारे में विवरण नहीं पता। ऐसे अन्य कारक भी हो सकते हैं जिनके बारे में मैंने नहीं सोचा था। अगर मुझे एक साक्षात्कार में इस प्रश्न का उत्तर देना पड़ा, तो मैं डॉन नूथ के "समयपूर्व अनुकूलन सभी बुराइयों की जड़" उद्धृत करता हूं।

0

उस प्रश्न का सबसे अच्छा जवाब है "यदि मैं वास्तव में वास्तव में पर आवश्यक हूं, तो मैं एक छोटा परीक्षण लिखूंगा"। वास्तविक उदाहरण प्राप्त करें और नियंत्रित स्थितियों के तहत इसे दो कार्यान्वयन के साथ चलाएं जो केवल इंटरफेस बनाम अमूर्त वर्ग में भिन्न हो। एक ठोस कार्यान्वयन के बिना, "जो तेज़ है" प्रश्न थोड़ा समझ में आता है। या तो साक्षात्कारकर्ता आपके महत्वपूर्ण सोच कौशल का परीक्षण करने की कोशिश कर रहा है (और संभवतः वास्तविक उत्तर से अनजान) दिखाने की कोशिश कर रहा था (क्या यह प्रश्न समझ में आता है?), या बेहद नाइट-पिकिश।

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

+0

पहले नियम दो बार दोहराने के लिए गंभीर रूप से लुभाने लगे, जैसा कि उन सभी "फाइट क्लब का पहला नियम" उद्धरण है ... – tucuxi

+1

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

+0

मेरा मुद्दा यह है कि हर जगह हाथ-अनुकूलन अनुकूलित करने से आपके समय का एक बहुत ही गरीब उपयोग है * केवल जहां यह वास्तव में मायने रखता है *। पहले प्रोफ़ाइल, गर्म क्या है, और * * * अनुकूलित करें। अन्यथा आप समय और प्रयास बर्बाद कर रहे हैं। – tucuxi

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