2008-09-10 12 views
6

क्या आप आमतौर पर अधिकतम गति या छोटे कोड आकार के लिए अनुकूलित करने के लिए अपने कंपाइलर को सेट करते हैं? या आप मैन्युअल रूप से व्यक्तिगत अनुकूलन सेटिंग्स को कॉन्फ़िगर करते हैं? क्यूं कर?आप आमतौर पर अपने कंपाइलर की अनुकूलन सेटिंग्स कैसे सेट अप करते हैं?

मुझे लगता है कि ज्यादातर समय लोग अपने डिफ़ॉल्ट स्थिति में कंपाइलर ऑप्टिमाइज़ेशन सेटिंग्स छोड़ देते हैं, जिसमें दृश्य सी ++ का मतलब अधिकतम गति है। मैंने हमेशा महसूस किया है कि डिफ़ॉल्ट सेटिंग्स को बेंचमार्क पर अच्छा दिखने के साथ और अधिक करना पड़ता है, जो छोटे प्रोग्राम होते हैं जो पूरी तरह से प्रदर्शन के लिए सबसे अच्छा क्या है, इसकी तुलना में पूरी तरह से एल 2 कैश के भीतर फिट होगा, इसलिए मैं इसे सामान्य रूप से छोटे आकार के लिए अनुकूलित करता हूं ।

उत्तर

6

एक सज्जन उपयोगकर्ता के रूप में मैंने पूर्ण ओएस पर कुछ अनुकूलन की कोशिश की है और इसके बारे में Gentoo forums पर अंतहीन चर्चाएं हुई हैं। जीसीसी के लिए कुछ अच्छे झंडे wiki में पाए जा सकते हैं।

संक्षेप में, आकार के लिए अनुकूलन सीमित रैम वाले पुराने पेंटियम 3 लैपटॉप पर सबसे अच्छा काम करता था, लेकिन कोर 2 डूओ के साथ मेरी मुख्य डेस्कटॉप मशीन पर, ओओ 2 ने सभी पर बेहतर परिणाम दिए।

यदि आप x86 (32 बिट) विशिष्ट झंडे में सबसे रूचि रखते हैं तो small script भी है।

यदि आप जीसीसी का उपयोग करते हैं और वास्तव में एक विशिष्ट अनुप्रयोग को अनुकूलित करना चाहते हैं, तो ACOVEA आज़माएं। यह बेंचमार्क का एक सेट चलाता है, फिर संकलन झंडे के सभी संभावित संयोजनों के साथ उन्हें पुन: संकलित करता है।

A relative graph of fitnesses: 

    Acovea Best-of-the-Best: **************************************    (2.55366) 
    Acovea Common Options: *******************************************   (2.86788) 
         -O1: **********************************************  (3.0752) 
         -O2: ***********************************************  (3.12343) 
         -O3: ***********************************************  (3.1277) 
      -O3 -ffast-math: ************************************************** (3.31539) 
         -Os: *************************************************  (3.30573) 

(ध्यान दें कि यह -Os पाया इस Opteron सिस्टम पर धीमी होने के लिए।)

+1

आपके उत्तर की पहली वाक्य मुझे http://web.archive.org/web/20041230075641/http://www.funroll-loops.org/ –

0

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

0

मेमोरी अब सस्ता है :) इसलिए जब तक आप एम्बेडेड सिस्टम के साथ काम नहीं करते हैं, तो अधिकतम गति तक कंपाइलर सेटिंग सेट करना सार्थक हो सकता है। बेशक उत्तर ठोस स्थिति पर निर्भर करता है।

1

मेरे लिए यह निर्भर करता है कि मैं किस प्लेटफॉर्म का उपयोग कर रहा हूं। कुछ एम्बेडेड प्लेटफार्मों के लिए या जब मैंने सेल प्रोसेसर पर काम किया था तो आपके पास बहुत कम कैश या कोड के लिए प्रदान की गई न्यूनतम जगह जैसी बाधाएं हैं।

मैं जीसीसी का उपयोग करता हूं और इसे "-ओ 2" पर छोड़ देता हूं जो अनुकूलन का "सबसे सुरक्षित" स्तर है और न्यूनतम आकार पर गति का समर्थन करता है।

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

2

मैं कम से कम आकार का उपयोग करना पसंद: वहाँ साइट पर Huffman एन्कोडिंग का उपयोग एक उदाहरण (कम बेहतर है) है। मेमोरी सस्ता हो सकती है, कैश नहीं है।

+3

की याद दिलाती है और आप जांचते हैं कि तेज़ कोड उत्पन्न करता है? –

+0

जब तक कि आप स्मृति की गंभीर स्थिति में न हों, आकार के लिए अनुकूलित करें अक्सर आपको खराब प्रदर्शन देगा –

1

माइक्रोसॉफ्ट अपने सभी सी/सी ++ सॉफ़्टवेयर को आकार के लिए अनुकूलित करता है। बेंचमार्किंग के बाद उन्होंने पाया कि यह वास्तव में बेहतर गति देता है (कैश इलाके के कारण)।

2

इस तथ्य के अलावा कि कैश इलाके के मामले (जैसे फ्रींड ने कहा), माइक्रोसॉफ्ट की एक और चीज है कि वे अपने आवेदन को प्रोफाइल करें और स्टार्टअप के पहले कुछ सेकंड के दौरान कौन से कोड पथ निष्पादित किए जाएं। उसके बाद वे इस डेटा को कंपाइलर को वापस खिलाते हैं और इसे उन हिस्सों को रखने के लिए कहते हैं जिन्हें स्टार्टअप के दौरान एक साथ बंद किया जाता है। इसका परिणाम तेजी से स्टार्टअप समय में होता है।

मुझे विश्वास है कि यह तकनीक सार्वजनिक रूप से वीएस में उपलब्ध है, लेकिन मैं 100% निश्चित नहीं हूं।

1

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

1

दोनों प्रोफ़ाइल बनाएं, प्रोफ़ाइल चुनें, जो विशिष्ट परियोजना और हार्डवेयर पर बेहतर काम करता है।

प्रदर्शन महत्वपूर्ण कोड के लिए, यह है - अन्यथा कोई भी चुनें और परेशान न करें।

0

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

0

इस तरह की ट्वीकिंग कंपाइलर सेटिंग्स एक अनुकूलन है। इस सिद्धांत पर कि "समयपूर्व अनुकूलन सभी बुराइयों की जड़ है," जब तक कार्यक्रम अपने अंतिम शिपिंग राज्य के नजदीक न हो तब तक मैं इससे परेशान नहीं हूं और मुझे पता चला है कि यह पर्याप्त तेज़ नहीं है - यानी लगभग कभी नहीं।

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

  • कोई संबंधित समस्या नहीं^_^