2011-05-26 17 views
12

में ओवरहेड मैं सोच रहा हूं कि ओवरहेड आपके कोड में अप्रयुक्त कार्यों का क्या है।अप्रयुक्त कोड

उदाहरण के लिए कहें कि आपके पास कुछ डिबग लॉगिंग है, और फिर आप अपनी अधिकांश ऑब्जेक्ट्स को ToString() फ़ंक्शन देते हैं जिसका उपयोग डीबग लॉग में किया जा रहा है।

रिलीज में डिबग लॉगिंग का उपयोग नहीं किया जा रहा है। क्या यह उन ToString() फ़ंक्शंस के स्रोत कोड को हटाने के लायक है? (उदाहरण के लिए मैक्रो के माध्यम से?)

या क्या वे निष्पादन योग्य मामूली रूप से बड़े होते हैं और अन्यथा प्रदर्शन को प्रभावित नहीं करते हैं? जैसे कोई गति प्रभाव नहीं? या यदि संकलक या लिंकर संभवतः फ़ंक्शंस को हटा देता है तो उनका उपयोग नहीं किया जाता है? यदि कंपाइलर या लिंकर कोड को नहीं हटाता है, तो क्या होगा यदि ToString() फ़ंक्शंस इनलाइन परिभाषित किए गए हों? संभवतः यह कोड को रेखांकित करने का प्रयास करेगा, और जब से समारोह कभी नहीं कहा जाता है, तो यह गायब हो जाएगा?

मुझे लगता है कि प्रत्येक कार्य को एक स्थिर lib में बनाए रखा जाना चाहिए, लेकिन एक बार निष्पादन योग्य के लिए संकलित किया गया है, निश्चित रूप से लिंकर द्वारा बहुत सारी चीज़ें अनदेखा की जाती हैं?

एक और नोट पर जो लगभग समान है, यदि कंपाइलर इनलाइन फ़ंक्शन को इनलाइन करने के लिए चुनता है, ताकि इनलाइन फ़ंक्शन को कई संकलन इकाइयों में फ़ंक्शन के रूप में परिभाषित किया गया हो, तो लिंकर अनावश्यक परिभाषाओं को दूर कर देगा और केवल एक को लिंक करेगा अंत में उन्हें?

धन्यवाद

+1

यह कंपाइलर पर निर्भर हो सकता है और इसका उपयोग किस अनुकूलन पर निर्भर करता है। – soandos

+4

"समयपूर्व अनुकूलन सभी बुराइयों की जड़ है" - डोनाल्ड नुथ –

+9

मैं समयपूर्व अनुकूलन मंत्र से बहुत थक गया हूं। हां आपकी मदद के लिए धन्यवाद। इसके अलावा: "आप जो कर रहे हैं उसे समझने से आप इसे अच्छी तरह से करने में मदद कर सकते हैं।" या आप असहमत हैं? निश्चित रूप से संकलक और लिंकर्स की समझ खराब नहीं है। लेकिन आपके इनपुट के लिए धन्यवाद। – Cookie

उत्तर

5

यह संकलक पर निर्भर करता है और, मुझे लगता है, अनुकूलन स्तर।

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

दूसरी ओर जीसीसी सभी कार्यों को रखता है, यहां तक ​​कि अप्रयुक्त इनलाइन वाले भी।

आपके अन्य प्रश्न का उत्तर दें: यदि किसी फ़ंक्शन को कई संकलन इकाइयों में परिभाषित किया गया है, तो लिंकर फेंक दिया जाएगा और लिंक करने से इंकार कर देगा, जब तक कि इसे इनलाइन के रूप में परिभाषित न किया जाए।

+0

बस अपनी अंतिम वाक्य फिर से करें: जब तक इसे इनलाइन के रूप में परिभाषित नहीं किया जाता है। इससे आपके कंपाइलर को फ्राइंग से रोकना चाहिए, भले ही यह इनलाइन परिभाषित नहीं किया गया हो। – Cookie

+0

@ कुकी: ठीक है, धन्यवाद। –

2

लिंकर्स डुप्लिकेट फ़ंक्शंस को हटाते हैं और वे बिना संदर्भित डेटा को हटाते हैं (माइक्रोसॉफ्ट लिंकर /OPF:REF और /OPT:ICF इन सेटिंग्स को ट्विक करने के लिए स्विच प्रदान करता है)।

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

ने कहा है कि अगर आप की जरूरत अपने निष्पादन संभव के रूप में छोटे होने के लिए (या यदि आप पता लगाना है कि आपके डिबगिंग कोड वास्तव में छवि आकार के सबसे लेता है), #ifdef ing सब कुछ कुछ कार्यों को लागू करने की सबसे सरल तरीका है शामिल नहीं किया जाना चाहिए। यह कोड को पढ़ने के लिए थोड़ा बदसूरत बनाता है लेकिन इसका लाभ यह है कि आप अपने रिलीज बिल्ड में डिबगिंग कोड के कुछ स्पॉट्स को गलती से याद नहीं कर सकते हैं क्योंकि किसी भी मौजूदा फ़ंक्शन को आमंत्रित करने के किसी भी प्रयास के परिणामस्वरूप एक कंपाइलर त्रुटि होगी।

#ifdef का एक और लाभ यह है कि यह पोर्टेबल है और एक विशेष संकलक प्रणाली पर निर्भर नहीं करता है: -/

+0

क्या आप कहेंगे कि इन डीबग टॉस्ट्रिंग कार्यों को इनलाइन के रूप में परिभाषित करना बेहतर है? – Cookie

+2

चूंकि संकलक हमेशा इनलाइन करने के लिए स्वतंत्र होता है या फ़ंक्शन इनलाइन नहीं करता है, इसलिए मैं केवल एक उद्देश्य के लिए 'इनलाइन' का उपयोग करता हूं: साझा हेडर फ़ाइलों में फ़ंक्शन परिभाषाएं प्राप्त करने में सक्षम होना। चूंकि यह वर्ग निकायों में परिभाषित सदस्य कार्यों के लिए निहित है, इसलिए मैं 'इनलाइन' निर्दिष्ट नहीं करता हूं। लेकिन कृपया ध्यान दें कि यह 'इनलाइन' के लिए मेरा व्यक्तिगत दृष्टिकोण है। –

3

1।संकलनकर्ता और Linkers

के बारे में यह वास्तव में कैसे आप अपने निष्पादन योग्य बनाने निर्भर करता है।

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

लेकिन यदि आप गतिशील रूप से लिंक करते समय वे वहाँ, हो जाएगा क्योंकि जहाँ तक पुस्तकालय का सवाल है, वे निर्यात किया जाता है और इसलिए इस्तेमाल किया।

एकाधिक परिभाषाओं के लिए, यह निर्भर करता है कि प्रतीक कमजोर है या नहीं। यदि यह कमजोर है, तो लिंकर परिभाषाओं में से एक चुनता है, अन्यथा यह उस पर चोक करता है।

अंततः, वे शायद आपके प्रोग्राम के एक मामूली हिस्से का प्रतिनिधित्व करते हैं।

2. इस मुद्दे को कैसे हल करें?

यह एक कठिन समस्या है, आप हमेशा कुछ चीजों को हटाने के लिए प्रीप्रोसेसर का उपयोग कर सकते हैं, लेकिन प्रीप्रोसेसर निर्देशों से भरे कोड को पढ़ने के लिए वास्तव में परेशान करना है।

व्यक्तिगत रूप से, मैं परेशान नहीं होता ... विशेष रूप से, क्योंकि मैं भी रिलीज के लिए लॉग इन (और कैसे नीचे उत्पादन मुद्दों पर नज़र रखने?)।

एक समाधान एक अलग फ़ाइल में अपमानजनक कार्यों को परिभाषित करने और रिलीज में उन्हें लिंक करने के लिए नहीं हो सकता है। नोट: मैं इसे आभासी कार्यों के लिए काम करता है, के बाद से वे कम से कम vtable

0

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

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