2009-04-28 19 views
28

के साथ स्थिर लाइब्रेरी बनाने के लिए अनुकूलन और झंडे मैं बस लिनक्स पर जी ++ कंपाइलर से शुरू कर रहा हूं और कंपाइलर झंडे पर कुछ प्रश्न प्राप्त कर रहा हूं। यहाँ वेजी ++

अनुकूलन

मैं अनुकूलन झंडे -O1, -O2 और -O3 जी ++ मैनुअल पृष्ठ में के बारे में पढ़ा है। मुझे नहीं पता था कि इन झंडे का उपयोग कब किया जाए। आमतौर पर आप किस अनुकूलन स्तर का उपयोग करते हैं? जी ++ मैनुअल -O2 के लिए निम्नलिखित कहता है।

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

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

स्टेटिक लाइब्रेरी

मैं जी का उपयोग कर एक स्थिर पुस्तकालय कैसे बना सकता हूँ ++? विजुअल स्टूडियो में, मैं एक क्लास लाइब्रेरी प्रोजेक्ट चुन सकता हूं और इसे "lib" फ़ाइल में संकलित किया जाएगा। जी ++ में समतुल्य क्या है?

+1

[2003 में, जीसीसी की -ओ 3 छोटी थी और खराब रैप मिला।] (Http://stackoverflow.com/a/11546263/845092) आजकल जब आप नियम तोड़ते हैं तो यह खराब कोड उत्पन्न करता है, लेकिन ब्रेकिंग जैसे लोग नियम होते हैं और परिणाम होने पर पागल हो जाते हैं, इसलिए अवैध कोड लिखने के परिणामों से बचने के लिए वे -ओ 2 तक चिपके रहते हैं। –

उत्तर

2

लूप अनलोलिंग और इनलाइनिंग के अलावा, एक संकलक कई अनुकूलन कर सकता है। लूप अनोलिंग और इनलाइनिंग का उल्लेख तब से किया जाता है, हालांकि वे कोड को तेज़ी से बनाते हैं, वे इसे बड़ा बनाते हैं।

एक स्थिर लाइब्रेरी बनाने के लिए, .o फाइलें और 'ar' उत्पन्न करने के लिए 'g ++ -c' का उपयोग करें ताकि उन्हें लाइब्रेरी में संग्रहीत किया जा सके।

+0

धन्यवाद। "आर" क्या है? क्या यह एक जी ++ कंपाइलर स्विच या एक खोल है? यह अच्छा होगा अगर आप मुझे दिखा सकें कि "ar" का उपयोग कैसे किया जाता है। –

+0

कोई समस्या नहीं है। मैंने "ar" की जांच की है और इसके लिए मैनुअल मिला है। –

4

अनुकूलन विकल्प का उपयोग करने के संबंध में - कोई भी सही उत्तर नहीं है।

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

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

जो भी आपको चाहिए, उसे मापने और अनुकूलित करने के लिए सबसे अच्छा है। कोशिश करें, मापें और निर्णय लें।

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

41

अंगूठे का नियम:

आप डिबग करने के लिए की जरूरत है, -O0 का उपयोग करें (। और डिबगिंग प्रतीकों उत्पन्न करने के लिए जी)

जब आप इसे जहाज के लिए तैयारी कर रहे हैं, -O2 का उपयोग करें।

जब आप gentoo का उपयोग करते हैं, तो -O3 ... का उपयोग करें!

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

+6

के लिए बहुत धन्यवाद सभी प्लेटफ़ॉर्म के लिए -O3 का उपयोग क्यों नहीं करते? विंडोज़ संभाल नहीं सकता -ओ 3? –

+0

अंगूठे के शासन के लिए धन्यवाद, जोश। लिनक्स मैन पेज में इस महत्वपूर्ण क्रम को शामिल नहीं किया गया था। – theJollySin

+1

मैं सिर्फ यह बताकर -ओ 3 चीज की रक्षा करना चाहता था कि इससे हल होने से अधिक समस्याएं हो सकती हैं। -ओ 3 में डिफॉल्ट लूप अनोलिंग और अन्य खतरनाक अनुकूलन शामिल हैं जो आपके कोड को कैसे कॉल किया जाता है, इस बारे में धारणाएं करते हैं। -ओ 2 अंगूठे के नियम के रूप में सुरक्षित है, लेकिन आपके पास एक कारण/कारण/ओ 3 पर जाना चाहिए। –

5

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

एक स्थिर पुस्तकालय का निर्माण करने के लिए, आप ar इस प्रकार का उपयोग करें:

ar rc libfoo.a foo.o foo2.o .... 
ranlib libfoo.a 

Ranlib हमेशा जरूरी नहीं है, लेकिन इसे का उपयोग नहीं करने के लिए कोई कारण नहीं है।

0

स्टेटिक लाइब्रेरी प्रश्न के संबंध में David Cournapeau द्वारा दिए गए उत्तर सही हैं लेकिन आप वैकल्पिक रूप से 'स्थिर' ध्वज का उपयोग अपनी स्थिर लाइब्रेरी फ़ाइल पर रैनलिब चलाने के बजाय 'ar' के साथ कर सकते हैं। 'ar' manual page बताता है कि

संग्रह पर ar s चलाना उस पर चलने वाली रैलीलिब के बराबर है।

आप जिस भी विधि का उपयोग करते हैं वह केवल व्यक्तिगत वरीयता का मामला है।