अस्वीकरण: मैंने पीजीओ के साथ इसे पढ़ने के बजाय और अधिक नहीं किया है और इसे मज़े के लिए नमूना प्रोजेक्ट के साथ एक बार करने की कोशिश की है। निम्नलिखित में से कई मेरे अनुभव पर आधारित हैं "गैर-पीजीओ" अनुकूलन और शिक्षित अनुमान। टीएल; नीचे डीआर।
This page पीजीओ द्वारा किए गए अनुकूलन सूचीबद्ध करता है। चलो उन्हें एक-एक करके देखो (प्रभाव के आधार पर वर्गीकृत):
इनलाइन - उदाहरण के लिए, यदि वहां मौजूद एक समारोह एक कि अक्सर समारोह बी कहता है, और समारोह बी अपेक्षाकृत छोटे प्रोफ़ाइल है, तो -guided अनुकूलन समारोह ए में समारोह बी इनलाइन जाएगा
रजिस्टर आवंटन - बेहतर आवंटन रजिस्टर में प्रोफ़ाइल डेटा परिणामों के साथ अनुकूलन।
आभासी कॉल अटकलें - एक समारोह सूचक माध्यम से एक आभासी कॉल, या अन्य कॉल, अक्सर एक निश्चित समारोह लक्षित करता है, एक प्रोफ़ाइल निर्देशित अनुकूलन अक्सर-लक्षित कार्य करने के लिए एक सशर्त-निष्पादित प्रत्यक्ष कॉल सम्मिलित कर सकते हैं , और प्रत्यक्ष कॉल रेखांकित किया जा सकता है।
ये स्पष्ट रूप से पूर्वानुमान को बेहतर बनाता है कि कुछ ऑप्टिमाइज़ेशन का भुगतान किया गया है या नहीं। गैर-प्रोफाइल कोड पथों के लिए कोई प्रत्यक्ष व्यापार नहीं।
बेसिक ब्लॉक अनुकूलन - बेसिक ब्लॉक अनुकूलन आमतौर पर निष्पादित करने की अनुमति देता बुनियादी ब्लॉक कि अस्थायी एक दिया सीमा के भीतर निष्पादित पृष्ठों (इलाके) के एक ही सेट में रखा जा रहा। यह उपयोग किए गए पृष्ठों की संख्या को कम करता है, इस प्रकार स्मृति ओवरहेड को कम करता है।
समारोह लेआउट - कॉल ग्राफ और प्रोफाइल कॉलर/कॉल प्राप्त करने वाला व्यवहार के आधार पर, कार्यों है कि एक ही निष्पादन मार्ग के किनारे हो जाते हैं एक ही अनुभाग में रखा जाता है।
मृत कोड पृथक्करण - कोड है कि रूपरेखा के दौरान नहीं बुलाया जाता है एक विशेष खंड है कि वर्गों के सेट के अंत में जोड़ा जाता है के लिए ले जाया जाता है। यह प्रभावी रूप से अक्सर उपयोग किए जाने वाले पृष्ठों से इस अनुभाग को रोकता है।
एह कोड पृथक्करण - एह कोड, असाधारण, निष्पादित किया जा रहा अक्सर एक अलग खंड में ले जाया जा सकता है जब प्रोफ़ाइल निर्देशित अनुकूलन निर्धारित कर सकते हैं कि अपवाद असाधारण परिस्थितियों पर ही होते हैं।
यह सब गैर-प्रोफाइल कोड पथों के इलाके को कम कर सकता है। मेरे अनुभव में, प्रभाव इस बात के बारे में उल्लेखनीय या गंभीर होगा यदि इस कोड पथ में एक तंग लूप है जो L1 कोड कैश से अधिक हो जाता है (और शायद L2 भी थ्रैश हो)। यह वास्तव में एक पथ की तरह लगता है जिसे एक पीजीओ प्रोफ़ाइल में शामिल किया जाना चाहिए :)
मृत कोड अलगाव का एक बड़ा प्रभाव हो सकता है - दोनों तरीकों से - क्योंकि यह डिस्क पहुंच को कम कर सकता है।
यदि आप तेजी से अपवादों पर भरोसा पर भरोसा करते हैं, तो आप इसे गलत कर रहे हैं।
आकार/स्पीड अनुकूलन - कार्य जहां कार्यक्रम खर्च करता है बहुत समय की गति के लिए अनुकूलित किया जा सकता है। ।
अंगूठे का नियम आजकल "डिफ़ॉल्ट रूप से आकार के लिए अनुकूलन करने के लिए, और केवल गति जहां जरूरत के लिए अनुकूलित (और सत्यापित करें कि यह मदद करता है) है कारण फिर से कोड कैश है - ज्यादातर मामलों में, छोटे कोड होगा कोड कैश की वजह से तेज़ कोड भी हो। इसलिए इस प्रकार का स्वचालित रूप से आपको क्या करना चाहिए। वैश्विक गति अनुकूलन की तुलना में, यह बहुत ही अटूट मामलों ("अजीब कोड" या एक में गैर-प्रोफाइल कोड पथ धीमा कर देगा असामान्य कैश व्यवहार के साथ लक्ष्य मशीन)।
सशर्त शाखा अनुकूलन - मूल्य जांच के साथ, प्रोफ़ाइल निर्देशित अनुकूलन अगर एक स्विच बयान में दिए गए मूल्य अन्य मूल्यों की तुलना में अक्सर प्रयोग किया जाता है पा सकते हैं। फिर यह मूल्य स्विच स्टेटमेंट से बाहर खींच लिया जा सकता है। अगर/अन्य निर्देशों के साथ वही विकल्प किया जा सकता है जहां ऑप्टिमाइज़र if/else को ऑर्डर कर सकता है ताकि या तो अगर ब्लॉक या अन्य ब्लॉक पहले रखा गया हो, तो कौन सा ब्लॉक अधिक बार सत्य होता है।
मैं इसे "बेहतर भविष्यवाणी" के तहत भी फाइल करूंगा, जब तक कि आप गलत पीजीओ जानकारी नहीं खिलाते।
विशिष्ट मामले में, जहां इस एक बहुत भुगतान कर सकते हैं समय पैरामीटर/रेंज मान्यता और समान पथ है कि एक सामान्य निष्पादन में कभी नहीं लिया जाना चाहिए चलाए जा रहे हैं।
तोड़ने मामला होगा:
if (x > 0) DoThis() else DoThat();
एक प्रासंगिक तंग पाश
में
और रूपरेखा केवल x> 0 मामला।
मेमोरी intrinsics - intrinsics के विस्तार बेहतर फैसला किया जा सकता है अगर यह निर्धारित किया जा सकता है एक आंतरिक अक्सर कहा जाता है यदि। चाल या प्रतियों के ब्लॉक आकार के आधार पर एक आंतरिक भी अनुकूलित किया जा सकता है।
फिर से, अधिकतर अनचाहे डेटा को दंडित करने की एक छोटी संभावना के साथ बेहतर जानकारी प्रदान करता है।
उदाहरण: - यह सब एक "शिक्षित अनुमान" है, लेकिन मुझे लगता है कि यह पूरे विषय के लिए काफी चित्रकारी है।
मान लें कि आपके पास memmove
है जिसे हमेशा 16 बाइट्स की लंबाई के साथ अच्छी तरह से गठबंधन गैर-ओवरलैपिंग बफर पर बुलाया जाता है।
एक संभावित अनुकूलन इन शर्तों की पुष्टि कर रहा है और इस मामले के लिए इनलाइन एमओवी निर्देशों का उपयोग कर रहा है, सामान्य स्थिति memmove
(संरेखण, ओवरलैप और विषम लंबाई को संभालने) को कॉल करते समय केवल शर्तों को पूरा नहीं किया जाता है।
लाभ के आसपास नकल structs की एक तंग पाश में महत्वपूर्ण हो सकता है, जैसा कि आप इलाके में सुधार, उम्मीद पथ अनुदेश, जोड़ी/पुनर्व्यवस्था के लिए अधिक संभावना के साथ होने की संभावना कम हो।
दंड comparedly छोटे, हालांकि है: PGO बिना सामान्य मामले में, आप या तो हमेशा पूर्ण memmove कॉल करें, या पूर्ण memmove कार्यान्वयन Nline होगा। ऑप्टिमाइज़ेशन कुछ जटिल (कुछ सशर्त कूद सहित) को कुछ जटिल में जोड़ता है, मैं सबसे ज्यादा 10% ओवरहेड मानता हूं। ज्यादातर मामलों में, कैश पहुंच के कारण ये 10% शोर से नीचे होंगे।
हालांकि, वहाँ महत्वपूर्ण प्रभाव के लिए एक बहुत मामूली मामूली मौका अगर अप्रत्याशित शाखा अक्सर एक साथ लिया जाता है और अतिरिक्त निर्देशों की उम्मीद मामले के लिए डिफ़ॉल्ट मामले के लिए निर्देश के साथ एल 1 कोड के बाहर एक तंग पाश धक्का है कैश
ध्यान दें कि आप पहले से ही संकलक के लिए क्या कर सकते हैं इसकी सीमाओं पर हैं। कोड के कैश में कुछ के मुकाबले अतिरिक्त निर्देशों को कुछ बाइट्स होने की उम्मीद की जा सकती है। एक स्थिर ऑप्टिमाइज़र उसी भाग्य को हिट कर सकता है इस पर निर्भर करता है कि यह कितनी अच्छी तरह से invariants उछाल सकता है - और आप इसे कितना देते हैं।
निष्कर्ष:
- अनुकूलन के कई तटस्थ हैं।
- कुछ अनुकूलन गैर प्रोफाइल कोड रास्तों
- प्रभाव आम तौर पर बहुत संभव लाभ
- , शायद ही कभी एक छोटा सा प्रभाव अन्य योगदान रोग कारकों
- कुछ पर बल दिया जा सकता है की तुलना में छोटा होता है पर थोड़ा नकारात्मक प्रभाव पड़ सकता अनुकूलन (यानी, कोड वर्गों के लेआउट) बड़ा प्रभाव डाल सकता है, लेकिन फिर संभव लाभ signidicantly outweight कि
मेरे पेट लग रहा है आगे का दावा है कि
- एक स्थिर अनुकूलक, एक पूरे पर, कम से कम समान रूप से एक रोग मामले
- यह बहुत वास्तव में करना कठिन होगा भी बुरा PGO इनपुट के साथ प्रदर्शन को नष्ट बनाने की संभावना होगी।
कि स्तर पर, मैं PGO कार्यान्वयन की भी बहुत कुछ डर होगा कीड़े/विफल PGO अनुकूलन के तुलना में कमियों।
मुझे पता है कि यह स्पष्ट लगता है, लेकिन अंगूठे के नियम के रूप में, आपको वास्तविक दुनिया डेटा पर संचालन करते समय प्रोफाइलिंग करने की कोशिश करनी चाहिए, कम से कम कोशिश करना (कम से कम कोशिश करना) सभी संभावित डेटा-पथ को कवर करना। – CAFxX