2009-05-20 23 views
10

यदि मैं "-ओ 2" ध्वज का उपयोग करता हूं, तो प्रदर्शन में सुधार होता है, लेकिन संकलन समय अधिक हो जाता है।जीसीसी के लिए -ओ 2 ध्वज का उपयोग कब करें?

मैं कैसे निर्णय ले सकता हूं कि इसका उपयोग करना है या नहीं?

शायद ओ 2 कुछ निश्चित प्रकार के कोड (जैसे गणित की गणना?) में सबसे अधिक अंतर बनाता है, और मुझे इसे केवल परियोजना के उन हिस्सों के लिए उपयोग करना चाहिए?

संपादित करें: मैं इस तथ्य पर जोर देना चाहता हूं कि मेरी परियोजना के सभी घटकों के लिए सेटिंग -ओ 2 कुल संकलन समय 10 मिनट से 30 मिनट में बदल देता है।

+2

यह आपके प्रश्न का उत्तर नहीं देता है, लेकिन yoru संपादन के आधार पर, ऐसा लगता है कि आपको अपनी परियोजना बनाने के तरीके को बदलने की जरूरत है। आपके शुरुआती निर्माण के बाद, इसे केवल संशोधित स्रोतों को .o में संकलित करना चाहिए और फिर .o फ़ाइलों को एक साथ जोड़ना चाहिए। – cyberconte

+0

प्रीकंपील्ड हेडर फाइलें प्रदर्शन को भी बनाने में मदद कर सकती हैं। –

उत्तर

23

मैं का उपयोग करना चाहिये होगा -O2 समय के सबसे अधिक, लाभ शामिल हैं:

  • आमतौर पर के आकार को कम कर देता जेनरेट कोड (विपरीत-ओ 3)।
  • अधिक चेतावनियां (कुछ चेतावनियों को विश्लेषण की आवश्यकता होती है जो केवल अनुकूलन के दौरान की जाती है)
  • अक्सर मापने योग्य प्रदर्शन (जो इससे कोई फर्क नहीं पड़ता)।

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

ऑप्टिमाइज़ेशन सक्षम होने के साथ स्रोत-स्तरीय डिबगिंग अधिक कठिन है, कभी-कभी किसी समस्या को डीबग करते समय ऑप्टिमाइज़ेशन को अक्षम करना उपयोगी होता है।

+1

यदि आपको कोड आकार को कम करने की आवश्यकता है, तो क्यों नहीं उपयोग -ओ 2 के बजाय? – Christoffer

+3

का उपयोग करना -Os समझ में आता है यदि कोड आकार सबसे अनुकूल चीज है - आमतौर पर यह नहीं है (छोटे एम्बेडेड सिस्टम को छोड़कर ...) –

+0

आकार के अनुकूलन के लिए कहा गया है कि मेरे पास आकार से अनुकूलित करने के लिए कहा गया है, गति के लिए अनुकूलित करने के लिए कहा। मैं हमेशा -O2, कभी-कभी -O3 का उपयोग करता हूं लेकिन इसके साथ चलने वाले जोखिमों को लेता हूं। –

5

हमेशा, जब आप प्रोग्रामिंग करते हैं और बस कुछ ऐसा परीक्षण करना चाहते हैं जिसे आपने अभी लिखा है।

11

मैं जैव सूचना विज्ञान में हूं इसलिए मेरी सलाह पक्षपातपूर्ण हो सकती है। उस ने कहा, मैं हमेशा-O3 स्विच (रिलीज और परीक्षण निर्माण के लिए, आमतौर पर डिबगिंग के लिए नहीं) का उपयोग करें। सच है, इसमें कुछ नुकसान हैं, अर्थात् संकलन-समय बढ़ाना और अक्सर निष्पादन योग्य का आकार।

हालांकि, पहला कारक आंशिक रूप से अच्छी बिल्ड रणनीति और अन्य चालों को समग्र निर्माण समय को कम करने के द्वारा आंशिक रूप से कम किया जा सकता है। इसके अलावा, चूंकि अधिकांश संकलन वास्तव में I/O बाध्य है, संकलन समय की वृद्धि अक्सर नहीं है जो उच्चारण है।

दूसरा नुकसान, निष्पादन योग्य आकार, अक्सर बस कोई फर्क नहीं पड़ता।

+1

बिल्कुल - आपके मेकफ़ाइल में निर्भरता पर ध्यान देने और ध्यान देने पर आम तौर पर संकलन समय को एक गैर-समस्या बनाता है। आम तौर पर निष्पादन योग्य आकार में मदद करता है, हालांकि मैंने देखा है कि लोग बहुत बेवकूफ सामान करते हैं जिसके परिणामस्वरूप बड़े कार्यक्रम होते हैं। –

+0

मुझे यह जवाब पसंद है, लेकिन मैं चेतावनी जोड़ूंगा कि इसे अनुकूलन के साथ चलाने में आसान होना चाहिए क्योंकि जीडीबी इस तरह से बहुत अच्छा काम करता है। – dicroce

+1

यह मेरा अनुभव है कि संकलन समय लिंक समय की तुलना में ठीक करने के लिए "आसान" है। ("लिंक समय कम करने" प्रश्नों की खोज करने का समय!) – leander

6

कभी नहीं।

उपयोग -O3 -Wall -Werror -std = [जो भी आपके कोड बेस का पालन करना चाहिए]

+1

एक प्रयोग के रूप में, मैंने दो-ओ 3 और साथ -ओएस के साथ लैम बनाया, कुछ फ़ाइलों के लिए -ओ 3 को छोड़कर प्रोफाइलिंग के बाद हाथ उठाया गया। ज्यादातर-ओएस संस्करण वास्तव में लगभग 10% तेज था। ऑप्टिमाइज़ेशन स्विच एक जादू प्रदर्शन डायल नहीं है, लेकिन इसे 11 तक क्रैंक करने से आपके निष्पादन योग्य बड़े हो सकते हैं, डीबगिंग को और अधिक कठिन बना दिया जा सकता है, और ऑप्टिमाइज़ेशन-संबंधित बग पेश कर सकते हैं। – LnxPrgr3

3

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

2

क्या बढ़ी हुई संकलन समय वास्तव में उल्लेखनीय है? मैं डिफ़ॉल्ट रूप से -ओ 2 का उपयोग डिफ़ॉल्ट रूप से करता हूं, कुछ भी कम आपके कोड में बहुत अधिक "घर्षण" छोड़ देता है। यह भी ध्यान रखें कि -O1, -O2 के अनुकूलन स्तर सबसे अच्छे परीक्षण किए जाते हैं, क्योंकि वे सबसे दिलचस्प हैं।-O0 और अधिक छोटी गाड़ी हो जाता है, और आप मेरे अनुभव में -O2 पर बहुत अच्छी तरह से डीबग कर सकते हैं। बशर्ते आपको कोड रीडरिंग, इनलाइनिंग इत्यादि के मामले में एक कंपाइलर क्या कर सकता है, इसके बारे में कुछ विचार है

-Werror -Wall आवश्यक है।

+0

ठीक है, किसी भी तरह से मेरी परियोजना के सभी घटकों के लिए सेटिंग -O2 कुल संकलन समय 10 मिनट से 30 मिनट –

+0

10 मिनट से 30 मिनट में बदल देता है। इससे आपको इससे बचने के लिए पर्याप्त दर्द होता है। मुद्दा लेना। – jakobengblom2

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