2009-07-15 11 views
5

से परे मैं देख रहा हूं कि प्रोग्रामर सी में क्या कर सकता है, जो जेनरेट ऑब्जेक्ट फ़ाइल का प्रदर्शन और/या आकार निर्धारित कर सकता है।प्रदर्शन या कोड आकार के लिए सी कोडिंग प्रथाओं - एक कंपाइलर

उदाहरण के लिए,
1. इनलाइन के रूप में सरल प्राप्त/सेट कार्यों की घोषणा
2. छोरों कि पाश चर के ही मूल्य का उपयोग नहीं करते के लिए, गणना (एक बड़ा पदचिह्न की कीमत पर) प्रदर्शन को बढ़ा सकता है इत्यादि की गणना करने के बजाए शून्य से नीचे

ऐसा लगता है कि कंपाइलर्स अब एक ऐसे स्तर तक उन्नत हो गए हैं जहां "सरल" चालें (ऊपर दिए गए दो बिंदुओं की तरह) की आवश्यकता नहीं है। संकलन के दौरान उचित विकल्प वैसे भी काम करते हैं। बिल्ली, मैंने यहां पोस्ट भी देखा कि कंपाइलर्स कैसे रिकर्सन को संभालते हैं - यह बहुत दिलचस्प था! तो फिर सी स्तर पर क्या करने के लिए हम क्या छोड़ रहे हैं? :)

मेरा विशिष्ट वातावरण है: जीसीसी 4.3.3 एआरएम आर्किटेक्चर के लिए फिर से लक्षित (v4)। लेकिन अन्य कंपाइलर्स/प्रोसेसर पर प्रतिक्रिया भी स्वागत है और इसे चालू किया जाएगा।

पीएस: मेरा यह दृष्टिकोण सामान्य "कोड पहले !, फिर बेंचमार्क, और अंततः अनुकूलन" दृष्टिकोण के खिलाफ चला जाता है।

संपादित: Should we still be optimizing "in the small"?

+0

http://stackoverflow.com/questions/110684/what-coding-techniques-do-you-use-for-optimising-c-programs http://stackoverflow.com/questions/178045/when- चाहिए-आप-स्टार्ट-ऑप्टिमाइज़िंग-कोड # 178079 http://stackoverflow.com/questions/242149/when-should-i-optimize –

+0

सामान्य "कोड पहले !, फिर बेंचमार्क, और अंततः अनुकूलित करें" के साथ क्या गलत है दृष्टिकोण? –

+0

इसके साथ कुछ भी गलत नहीं है - यह _should_ जिस तरह से अनुकूलन किया जाता है। मेरा उद्देश्य यह जांचना है कि क्या मैं डेवलपर को प्रदर्शन और/या क्षेत्र के लिए त्वरित रूप से बदलने में मदद करने के लिए कोड को पुन: सक्रिय करने के लिए एक उपकरण लागू कर सकता हूं (प्रोफाइलिंग के बाद)। एक ग्रहण प्लगइन (या एक विम स्क्रिप्ट) की कल्पना करें जो लूप को हाइलाइट करता है और कहने के विकल्प देता है, उन्हें अनलॉक करता है या आंतरिक और बाहरी लूप स्विच करता है। मुझे इस पोस्ट में इसे स्पष्ट करना चाहिए था, इसके बारे में खेद है। और लिंक के लिए धन्यवाद! –

उत्तर

6

एक बात मैं कि एक संकलक शायद अनुकूलन नहीं होगा के बारे में सोच सकते हैं "कैश-मित्रता" है: बस की तरह यह इतना होता है, मैं प्रश्न पोस्ट करने के बाद एक ऐसी ही पोस्ट पाया: यदि आप पंक्ति-प्रमुख क्रम में दो-आयामी सरणी पर पुनरावृत्त कर रहे हैं, तो सुनिश्चित करें कि कैश थ्रैशिंग से बचने के लिए आपका आंतरिक पाश कॉलम इंडेक्स में चलता है। गलत इंडेक्स पर चलने वाले आंतरिक लूप को एक बड़ा प्रदर्शन हिट कर सकता है।

यह सभी प्रोग्रामिंग भाषाओं पर लागू होता है, लेकिन यदि आप सी में प्रोग्रामिंग कर रहे हैं, तो प्रदर्शन आपके लिए महत्वपूर्ण है, इसलिए यह विशेष रूप से प्रासंगिक है।

+0

AFAIK एआरएम v4 प्रोसेसर में कैश नहीं है। – starblue

+0

निर्भर करता है ... परिवार के कुछ सदस्य करते हैं, कुछ नहीं करते हैं। (Http://en.wikipedia.org/wiki/ARM_architecture) –

5

"हमेशा" अपने एल्गोरिदम के समय और स्थान की जटिलता को जानें। संकलक कभी भी उस नौकरी को करने में सक्षम नहीं होगा जैसा आप कर सकते हैं। :)

1

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

अगर आप कई बड़े सरणियों का उपयोग कर रहे वाकई समूह कैश बढ़ाने हिट बनाने के लिए उन्हें जहां वे इस्तेमाल किया जाएगा पर एक दूसरे के करीब,

3

संकलनकर्ता इन दिनों अभी भी बहुत है ताकि आप अपने कोड vectorizing में अच्छा नहीं कर रहे हैं ' आप अभी भी अधिकांश एल्गोरिदम के सिम कार्यान्वयन करना चाहते हैं।

आपकी सटीक समस्या के लिए सही डेटास्ट्रक्चर चुनना नाटकीय रूप से प्रदर्शन में वृद्धि कर सकता है (मैंने ऐसे मामलों को देखा है जहां एक केडी-पेड़ से बीवीएच तक जाने से वह विशिष्ट मामले में ऐसा होगा)।

कंपाइलर्स कैश में फ़िट होने के लिए कुछ structs/चर पैड कर सकते हैं लेकिन अन्य डेटा कैश ऑप्टिमाइज़ेशन जैसे आपके डेटा की इलाके अभी भी आपके ऊपर हैं।

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

2

क्या मार्टिन कैश-मित्रता के बारे में ऊपर का कहना है करने के लिए जोड़ने के लिए: एक ही कैश लाइन में

  • अपने संरचनाओं को पुन: क्रम ऐसा है कि खेतों जो आमतौर पर एक साथ पहुँचा रहे हैं लोड हो रहा है सिर्फ एक कैश द्वारा उदाहरण के लिए (मदद कर सकते हैं दो की बजाय लाइन।) आप अनिवार्य रूप से ऐसा करके अपने डेटा कैश में उपयोगी डेटा की घनत्व में वृद्धि कर रहे हैं। एक लिनक्स उपकरण है जो आपको ऐसा करने में मदद कर सकता है: बौने 1http://www.linuxinsight.com/files/ols2007/melo-reprint.pdf

  • आप अपने कोड की घनत्व बढ़ाने के लिए एक समान रणनीति का उपयोग कर सकते हैं। जीसीसी में आप संभावित/असंभव टैग का उपयोग कर गर्म और ठंड शाखाओं को चिह्नित कर सकते हैं। इससे जीसीसी को ठंड शाखाओं को अलग-अलग रखने में मदद मिलती है जो आईकाचे घनत्व को बढ़ाने में मदद करता है।

और अब कुछ पूरी तरह से अलग के लिए:

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

नोट: ये स्पष्ट रूप से माइक्रो-ऑप्टिमाइज़ेशन हैं, केवल बाद के चरण में किए जाने के लिए जब आप अपने कोड से प्रदर्शन की आखिरी बिट्स को लिखने की कोशिश कर रहे हैं।

0

कई लोगों को इस बारे में पता नहीं है: एक इनलाइन लेबल परिभाषित करें (कंपाइलर द्वारा भिन्न होता है) जिसका अर्थ है इनलाइन, इसके इरादे में - कई कंपाइलर्स कीवर्ड को मूल अर्थ से पूरी तरह से अलग संदर्भ में रखते हैं। कंपाइलर लाइन से बाहर छोटी चीजों को पॉपिंग शुरू करने से पहले, इनलाइन आकार सीमाओं को बढ़ाने के तरीके भी हैं। मानव निर्देशित इनलाइनिंग बहुत तेज कोड उत्पन्न कर सकती है (कंपाइलर अक्सर रूढ़िवादी होते हैं, या पर्याप्त कार्यक्रम के लिए खाते नहीं हैं), लेकिन आपको इसे सही तरीके से उपयोग करना सीखना होगा, क्योंकि यह आसानी से प्रतिकूल हो सकता है। और हाँ, यह बिल्कुल कोड आकार के साथ ही गति पर लागू होता है।

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