2012-01-15 6 views
6

मुझे ऑनलाइन कहीं पढ़ना याद है कि बेहद कम विलंबता स्थितियों में वर्चुअल फ़ंक्शंस का उपयोग IF कथन के विकल्प के रूप में बेहतर है।आईएफ कथन के बजाय वर्चुअल फ़ंक्शंस का उपयोग करना तेज है?

क्या यह सच है? क्या वे मूल रूप से गतिशील polymorphism गति परिस्थितियों के लिए बेहतर कह रहे हैं?

क्या किसी भी उपयोगकर्ता के पास कोई अन्य सी ++ कम विलंबता "क्विर्क" साझा कर सकती है?

+1

मुझे लगता है कि यह कारकों के समूह पर निर्भर करता है - कम से कम कितने 'अगर कैस्केड किए गए हैं। एएसटी में प्रत्येक नोड के लिए एक कंपाइलर और एक [विज़िटर पैटर्न] (http://en.wikipedia.org/wiki/Visitor_pattern) के मामले पर विचार करें। बेशक, इस तरह के पैटर्न का उपयोग कक्षाओं के समूह पर कोड फैलाने जैसी अन्य कम वांछनीय विशेषताओं का कारण बन सकता है। –

+5

एक अच्छे टायर की तरह आपको सभी चीज़ों की एक चीज़ की आवश्यकता है: प्रोफाइल, प्रोफाइल, प्रोफाइल। –

+0

मुझे लगता है कि यह सटीक कोड पर अत्यधिक निर्भर होने जा रहा है और केवल वास्तविक जवाब कुछ अरब बार है और देखें कि अंतर क्या है। –

उत्तर

7

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

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

+0

कुछ प्रोसेसर नोट करें अप्रत्यक्ष शाखाओं की भविष्यवाणी करने का भी प्रयास करें (उदाहरण के लिए एएमडी परिवार 15 एच के लिए 512 प्रविष्टियां तालिका है), "संदर्भ में माप और माप" सलाह के महत्व को बढ़ाते हुए। – AProgrammer

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