2016-08-30 5 views
12

(यह जीसीसी और बजना बारे में एक प्रश्न है, लेकिन अन्य compilers के लिए लागू हो सकता है।)-g के साथ संकलन करता है, अपने आप में, प्रदर्शन को कम कर देता है?

अगर मैं अपने सी या सी ++ कोड संकलन, और -g स्विच का उपयोग डिबग जानकारी उत्पन्न, के प्रदर्शन को नीचा यह अपने आप में है किसी भी तरह से संकलित कार्यक्रम ... (1.) न्यूनतम अनुकूलन के साथ (-O0)? (2.) अधिकतम अनुकूलन के साथ (-O3)?

नोट: मेरा मतलब यह नहीं है कि निष्पादन योग्य को पार्स/लोड करने का प्रदर्शन जुर्माना है, जो अतिरिक्त सामग्री के कारण बड़ा है; मेरा मतलब है कि कोड चलाया गया है।

+1

'-g' के साथ संकलित एक प्रोग्राम की तुलना करें और '-g' के बिना संकलित एक ही प्रोग्राम की तुलना करें। आपको वास्तविक जेनरेट कोड में कोई अंतर नहीं दिखना चाहिए। –

+4

@ जोचिमपिलबोर्ग: तथ्य यह है कि मुझे किसी विशिष्ट कार्यक्रम के लिए उत्पन्न कोड में कोई अंतर नहीं दिखता है, इसका मतलब यह नहीं है कि कभी भी कोई फर्क नहीं पड़ता ... – einpoklum

+0

कड़ाई से देखा गया: हां, कम से कम जब आप निष्पादन योग्य के भीतर डिबगिंग प्रतीक रखते हैं , क्योंकि इसका मतलब है कि लोड करने के लिए और अधिक है (या लोड होने के दौरान छोड़ें)। यह आईएमओ अभ्यास में नगण्य है, यद्यपि। –

उत्तर

6

मुझे नहीं लगता कि कोई प्रदर्शन अंतर है। दरअसल जेनरेट कोड वही होगा और -g प्रलेखन here के अनुसार -O के साथ प्रयोग योग्य है। इसके अलावा, डिबगिंग प्रतीकों को कोड में नहीं लिखा जाता है, लेकिन "डीबग सेक्शन" नामक किसी अन्य खंड में, जिसे रनटाइम पर भी लोड नहीं किया जाता है (केवल डीबगर द्वारा)

-g क्या अनुकूलन नहीं चलाएगा, या कोड उत्पन्न नहीं होगा ।

शॉर्टकट अनुकूलित कोड द्वारा लिया कभी कभी आश्चर्य की बात हो सकती है:: यह जीसीसी नीति में कहा गया है here

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

तो अंत में डिबगिंग आपका अनुकूलन चोट कभी नहीं होगा, लेकिन विपरीत झूठे और -O3 का उपयोग कर (उदाहरण के लिए बेकार चर हटा कर) अपने डीबगिंग जानकारी में कमी आ सकती है।

नोट यह बाद से यह होगा (कहा गया है here) -Og उपयोग करने के लिए उस मामले में बेहतर हो सकता है कि:

अनुकूलन डीबगिंग अनुभव। -ऑग अनुकूलन सक्षम करता है जो डीबगिंग में हस्तक्षेप नहीं करता है। यह मानक संपादन-संकलन-डीबग चक्र के लिए अनुकूलन स्तर होना चाहिए, तेजी से संकलन और एक अच्छा डिबगिंग अनुभव बनाए रखने के दौरान अनुकूलन के उचित स्तर की पेशकश करता है।

हालांकि यह प्रदर्शन को प्रभावित करेगा क्योंकि कुछ ऑप्टिमाइज़ेशन पास करता है जो डिबगिंग में हस्तक्षेप करेगा।


संपादित करें:

लिंक और कोटेशन gcc यह करने के लिए अपने सवाल का जवाब इस तरह के clang के रूप में अन्य compilers पर लागू नहीं हो सकता है। हालांकि मुझे clang के लिए कुछ दस्तावेज भी मिला है। उदाहरण here के लिए:

असल में, डिबग जानकारी आप के साथ "-O0 जी" एक कार्यक्रम संकलन और मिल पूर्ण डिबग जानकारी है, तो आप मनमाने ढंग से कार्यक्रम को संशोधित करने के रूप में यह एक डिबगर से कार्यान्वित की इजाजत दी की अनुमति देता है । "-O3 -g" के साथ एक प्रोग्राम को संकलित करना आपको पूर्ण डीबग जानकारी देता है जो हमेशा पढ़ने के लिए उपलब्ध और सटीक है (उदाहरण के लिए, आपको पूंछ कॉल उन्मूलन और इनलाइनिंग के बावजूद सटीक स्टैक निशान मिलते हैं), लेकिन आप खो सकते हैं प्रोग्राम को संशोधित करें और कॉल फ़ंक्शन जहां प्रोग्राम से अनुकूलित किया गया था, या पूरी तरह से रेखांकित किया गया था।

+0

@ एनोपोकलम यह सिर्फ एक अनुस्मारक था। लेकिन मुझे लगता है कि शुरुआत आपके सवालों का जवाब देती है। यह केवल अतिरिक्त जानकारी थी क्योंकि आप इसे जान सकते हैं लेकिन अन्य नहीं हो सकते हैं। मैंने देखा कि आपने अपनी टिप्पणियां हटा दी हैं, इसके लिए कोई कारण? मुझे लगता है कि मैंने यहां आपके प्रश्न का उत्तर दिया है – LBes

-1

यदि आप इसे डीबगर के बाहर चलाते हैं तो कोई प्रदर्शन हिट नहीं होगी। डीबग प्रतीक डीबगिंग की सहायता के लिए हैं। जेनरेट कोड दोनों मामलों में समान होगा।

+3

अपनी राय का समर्थन करने के लिए कुछ पोस्ट करें। – Zereges

1

-g ध्वज बाइनरी में डीबगिंग जानकारी जोड़ता है। यह .text CPU रन बिट से निष्पादन योग्य के एक अलग सेक्शन (.stab और .stabstr) में मौजूद है। डीबगर के बाहर चलाते समय, डीबग सेक्शन ऑपरेटिंग सिस्टम लोडर द्वारा लोड नहीं होता है। डीबग जानकारी को strip उपयोगिता का उपयोग करके बाइनरी उत्पन्न करने के लिए आसानी से हटाया जा सकता है जो कि ध्वज के बिना संकलित एक जैसा है।

आम तौर पर जब आप सामान डीबग करना चाहते हैं तो आप ऑप्टिमाइज़ेशन और एनडीईबीयूजी प्रीप्रोसेसर मैक्रो के बिना संकलित होंगे। हालांकि इन चीजों को -जी ध्वज द्वारा नियंत्रित नहीं किया जाता है।

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