2010-10-04 9 views
6

कोड डुप्लिकेशन is usually bad और अक्सर स्थान के लिए काफी आसान है। मुझे लगता है कि कंपाइलर्स इसे स्वचालित रूप से सबसे आसान मामलों में पहचान सकते हैं - वे पहले से ही पाठ को पार्स कर सकते हैं और इंटरमीडिएट प्रतिनिधित्व प्राप्त करते हैं जो वे विभिन्न तरीकों से विश्लेषण करते हैं - अनियमित चर जैसे संदिग्ध पैटर्न का पता लगाएं, उत्सर्जित कोड अनुकूलित करें आदि। मुझे लगता है कि वे अक्सर कार्यात्मक रूप से डुप्लिकेट का पता लगा सकते हैं मशीन कोड उत्सर्जित करते समय इस तरह से कोड और इसके लिए खाता।क्या सी ++ कंपाइलर स्वचालित रूप से डुप्लिकेट कोड को खत्म कर सकते हैं?

क्या सी ++ कंपाइलर्स हैं जो डुप्लिकेट कोड का पता लगा सकते हैं और केवल स्रोत टेक्स्ट में प्रत्येक डुप्लिकेट के बजाय संबंधित मशीन कोड उत्सर्जित कर सकते हैं?

+1

आलसी मैन का कंपाइलर सूचीबद्ध है? – Stephen

+1

मुझे नहीं लगता कि यह अनुकूलक कार्यान्वयनकर्ताओं के लिए उच्च प्राथमिकता है, क्योंकि इस प्रकार का डुप्लिकेट कोड टीम मैनेजर/कोड समीक्षा स्तर पर पकड़ा जाना चाहिए। या बल्कि, "अच्छा अभ्यास" स्तर ... – DevSolar

+0

@ स्टीफन: हाँ।हम पहले से ही उस बिंदु तक पहुंच चुके हैं जब संकलक सूक्ष्मदर्शीकरण की परवाह करने के लिए पर्याप्त कुशल कोड को उत्सर्जित करता है। – sharptooth

उत्तर

9

कुछ करते हैं, कुछ नहीं करते हैं।

LLVM अनुकूलन के पृष्ठ से: -mergefunc (MergeFunctions pass, how it works)

कार्यों LLVM मध्यवर्ती प्रतिनिधित्व में छोटे ब्लॉकों में अलग होती है, इस अनुकूलन पास समान ब्लॉकों मर्ज करने के लिए कोशिश करता है। हालांकि सफल होने की गारंटी नहीं है।

आपको इस पृष्ठ पर कई अन्य अनुकूलन मिलेंगे, भले ही उनमें से कुछ पहली नज़र में गुप्त दिखाई दे।

मैं एक नोट जोड़ूंगा, हालांकि डुप्लिकेट कोड कंपाइलर/निष्पादन योग्य के लिए इतना बुरा नहीं है, यह रखरखाव बिंदु से खराब है, और इसके बारे में कोई संकलक कुछ भी नहीं कर सकता है।

+0

मुझे लगता है कि यह सफल होने पर भी गति में सुधार करने की गारंटी नहीं है। निश्चित रूप से कुछ लोगों को +1 –

+0

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

+0

@jk: मैं मानता हूं कि गति में सुधार नहीं किया जा सकता है, मुझे लगता है कि यह पारंपरिक पाश अनोलिंग अनुकूलन के खिलाफ चला जाता है। हालांकि आप एलएलवीएम फ्रेमवर्क के साथ निर्दिष्ट कर सकते हैं कि आप किस क्रम में अनुकूलन लागू करना चाहते हैं, ताकि आप जुड़ सकें। वे सटीक नहीं हैं अगर एक प्रकार का हेरिस्टिक लागू होता है (कोड के आकार के आधार पर?)। एक तरफ यह एक और मेमोरी लोकेशन पर कूदता है, दूसरी तरफ कम कोड जितना अधिक होता है उतना ही कैश में होता है ... तो मुझे लगता है कि, एक बार और, आपको बस अपने छोटे टुकड़े के लिए मापने की जरूरत है कोड :) –

8

मुझे लगता है कि सवाल झूठी धारणा बनाता है कि संकलक हमेशा कोड डुप्लिकेशन को खत्म करना चाहते हैं। कोड डुप्लिकेशंस स्रोत कोड की पठनीयता/रखरखाव के लिए खराब है संकलित कोड के प्रदर्शन प्रदर्शन, वास्तव में loop unrolling को संकलक के रूप में 0-पर विचार कर सकता है जो गति बढ़ाने के लिए डुप्लिकेट कोड जोड़ रहा है। संकलित कोड को स्रोत कोड के समान सिद्धांतों का पालन करने की आवश्यकता नहीं होती है और आम तौर पर यह मशीन के लिए नहीं है क्योंकि यह मनुष्यों को पढ़ने के लिए नहीं है।

आम तौर पर कंपाइलर्स व्यस्त कोड कोडिंग को परिवर्तित नहीं कर रहे हैं, निश्चित रूप से आईडीई दोनों की अनुमति दे सकता है।

+2

विलय कोड उत्पादित लाइब्रेरी/निष्पादन योग्य के आकार को कम कर देता है, इसलिए यह निष्पादन को भी तेज कर सकता है। मैं मानता हूं कि यह लूप अनलॉकिंग के साथ कुछ हद तक संघर्ष करेगा। –

+3

अधिकांश चीजों के साथ एक व्यापार बंद है, लेकिन यह मानना ​​है कि संकलक हमेशा डुप्लिकेशंस को खत्म करने का प्रयास करना चाहिए झूठी –

+2

मुझे नहीं पता कि यह प्रश्न कहां से इस तरह की धारणा बनाता है। यह पूछ रहा है कि क्या कोई कंपाइलर्स ऐसा करता है, भले ही यह एक अच्छा विचार न हो, न ही संकलक जो * हमेशा * कर सकते हैं * करेंगे * करेंगे। –

1

विज़ुअल सी ++ ऐसा करता है यदि आप 'कोड आकार को छोटा करें' (/ O1) निर्दिष्ट करते हैं। प्रदान किया गया कार्य /Og के लिए दस्तावेज़ों में वर्णित है, जिसे सरल पकड़ के पक्ष में हटा दिया गया है-आकार या पक्ष की गति (/ ओ 2) के पक्ष में सभी विकल्प।

3

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

कुछ अनुकूलन जैसे return value optimization, function inlining जो पूरे कार्यों में हो सकते हैं। हालांकि अधिकांश अनुकूलन समारोह के भीतर ही किया जाता है। यह आमतौर पर उच्च भाषा स्तर पर नहीं किया जाता है, इसका मतलब है कि संकलक सी ++ कोड को नहीं देखता है और इसे अनुकूलित करना शुरू कर देता है। कंपाइलर्स में उच्च स्तर की भाषा (सी ++) और मशीन भाषा के बीच ज्यादातर मध्यस्थ प्रतिनिधित्व होता है। यह मध्यस्थ प्रतिनिधित्व (आईआर) कुछ हद तक मशीन भाषा के समान है लेकिन सिस्टम की मशीन भाषा बिल्कुल ठीक नहीं है जिस पर कोड संकलित किया गया है। विकी पेज http://en.wikipedia.org/wiki/Compiler_optimization का संदर्भ लें, इसमें कुछ ऑप्टिमाइज़ेशन

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

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