2009-03-17 11 views
11

का अर्थ मैं इस ध्वज को मेकफ़ाइल में बहुत कुछ देखता हूं। इसका क्या अर्थ है और इसका उपयोग कब किया जाना चाहिए?gcc -O2

+0

@cdonner: क्योंकि वह जीसीसी के आदमी पृष्ठों से सवाल पूछ रहा है वह downvoted था

के बारे में झंडे/विकल्प विभिन्न अनुकूलन के स्तर और उनके विवरण में इस्तेमाल किया और जानने के लिए। शायद उद्देश्य पर? –

+1

यह लड़का बहुत सारे प्रश्न पूछ रहा है कि वह खुद को आसानी से जवाब प्राप्त कर सकता है। हर Google जीसीसी के लिए दस्तावेज़? –

+0

ब्रायन के साथ पूरी तरह से सहमत हैं। ऐसे प्रश्न पोस्ट करने से पहले लोगों को आदमी और Google को आजमाएं। – qrdl

उत्तर

33

अनुकूलन स्तर 2.

जीसीसी आदमी पृष्ठ से:

-O1 अनुकूलन। अनुकूलन संकलन कुछ हद तक अधिक समय लेता है, और एक बड़े समारोह के लिए अधिक मेमोरी लेता है।

-O2 और भी अनुकूलित करें। जीसीसी लगभग सभी समर्थित अनुकूलन करता है जिसमें स्पेस-स्पीड ट्रेडऑफ़ शामिल नहीं है। कंपाइलर लूप अनोलिंग या फ़ंक्शन निष्पादित करता है जब आप -O2 निर्दिष्ट करते हैं। -ओ की तुलना में के रूप में, यह विकल्प दोनों संकलन समय और जेनरेट कोड के प्रदर्शन को बढ़ाता है।

-O3 अभी तक और अधिक अनुकूलित करें। -ओ 3 -O2 और द्वारा निर्दिष्ट सभी अनुकूलन को चालू करता है -फिनलाइन-फ़ंक्शंस, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload और -ftree-vectorize विकल्प भी चालू करता है।

-O0 संकलन समय कम करें और डिबगिंग को अपेक्षित परिणामों का उत्पादन करें। यह डिफ़ॉल्ट है।

-Os आकार के लिए अनुकूलित करें। -ऑओ सभी-ओ 2 ऑप्टिमाइज़ेशन सक्षम करता है जो आम तौर पर कोड आकार में वृद्धि नहीं करते हैं। यह कोड आकार को कम करने के लिए डिज़ाइन किए गए और अनुकूलन करता है।

3

यह एक अनुकूलन स्विच है। जीसीसी --help देखें। http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

ध्यान दें, कि कुछ वर्षों में पहले -O3 जरूरत से ज्यादा कोड "का अनुकूलन" द्वारा कुछ खामियों का कारण बन सकता:

12

अनुकूलन स्तर 2, अधिकतम 3. देखें है। AFAIK, यह अब जीसीसी के आधुनिक संस्करणों के साथ सच नहीं है। लेकिन जड़त्व के साथ, -O2 "अधिकतम सुरक्षित" माना जाता है।

1

संकलनकर्ता बेकार कोड खोजने के लिए और अपने कोड में तेजी लाने के डेटा के खतरों से बचने के लिए पाश unrolling, सीपीयू पाइपलाइन अनुकूलन जैसे विभिन्न अनुकूलन तकनीकों का उपयोग कर सकते हैं। उदाहरण के लिए, एक पाश है कि समय की एक निश्चित राशि होता लूप नियंत्रण भूमि के ऊपर के बिना सन्निहित कोड में परिवर्तित हो जाएगा। या यदि सभी लूप पुनरावृत्तियों स्वतंत्र हैं, तो कुछ कोड समांतरता संभव है।

2 के लिए अनुकूलन स्तर स्थापना बताता है कि कितना ऊर्जा संकलक उन अनुकूलन की तलाश में बिताना चाहिए। http://en.wikipedia.org/wiki/Compiler_optimization

2

की कोशिश की मैनपेज: संभावित मान 1 से 3

से आप क्या संकलक अपने कोड का अनुकूलन करने के लिए कर सकते हैं के बारे में अधिक सीख सकते हैं सीमा?

-O2

और भी अनुकूलित करें। जीसीसी लगभग सभी अनुकूलन नहीं है जो एक अंतरिक्ष गति दुविधा यह शामिल नहीं है समर्थित निष्पादित करता है। संकलक जब आप -O2 निर्दिष्ट पाश unrolling या समारोह इनलाइन किए जाने वाले प्रदर्शन नहीं करता।-ओ की तुलना में, यह विकल्प संकलन समय और जेनरेट कोड के प्रदर्शन दोनों को बढ़ाता है।

मानव शब्दों में: यह अनुकूलन का सबसे सही सचमुच सुरक्षित तरीका है। -ओ 3 पुनर्गठन करता है जो कभी-कभी परेशानी हो सकती है। इस तरह का विषय काफी गहरा है।

1

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

डिफ़ॉल्ट ऑप्टिमाइज़ेशन बंद है। इसका परिणाम सबसे तेज़ संकलन समय में होता है, लेकिन संकलक ऑप्टिमाइज़ करने का बिल्कुल प्रयास नहीं करता है, और जेनरेट किए गए प्रोग्राम ऑप्टिमाइज़ेशन सक्षम होने की तुलना में काफी बड़े और धीमे होते हैं। ऑप्टिमाइज़ेशन स्तर को नियंत्रित करने के लिए जीसीसी में विभिन्न-ओ स्विच (अनुमत रूप -O0, -O1 -O2, -O3, और -Os) हैं:

-O0 कोई अनुकूलन नहीं; unoptimized कोड उत्पन्न करता है लेकिन सबसे तेज़ संकलन समय है। यह डिफ़ॉल्ट है।

-O1 मध्यम अनुकूलन; उचित रूप से अच्छी तरह से अनुकूलित करता है लेकिन संकलन समय को काफी हद तक कम नहीं करता है। बड़े समारोह के लिए यह बहुत अधिक स्मृति लेता है।

-O2 जीसीसी लगभग सभी समर्थित अनुकूलन करता है जिनमें स्पेस-स्पीड ट्रेडऑफ शामिल नहीं है। जब आप

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

-Os आकार के लिए अनुकूलित करें। -ऑओ सभी-ओ 2 ऑप्टिमाइज़ेशन सक्षम करता है जो आम तौर पर कोड आकार में वृद्धि नहीं करते हैं। यह कोड आकार को कम करने के लिए डिज़ाइन किए गए और अनुकूलन भी करता है। http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

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