आम तौर पर मुझे इस शब्द से नफरत है, "समय से पहले अनुकूलन", लेकिन यह इसके बारे में बताता है। यह ध्यान देने योग्य है कि नुथ ने महत्वपूर्ण क्षेत्रों goto
में कोड को गति देने के लिए बयानों का उपयोग करने के लिए धक्का देने के संदर्भ में इस प्रसिद्ध उद्धरण का उपयोग किया । यह महत्वपूर्ण है: महत्वपूर्ण पथ।
वह goto
कोड को तेज करने के लिए उपयोग करने का सुझाव दे रहा था, लेकिन उन प्रोग्रामरों के खिलाफ चेतावनी दे रहा था, जो कोड के लिए इस तरह के काम करना चाहते हैं जो कोड के लिए कूबड़ और अंधविश्वास पर आधारित है जो कि गंभीर भी नहीं है।
एक कोडबेस के दौरान switch
यथासंभव समान रूप से बयानों का पक्ष लेने के लिए (चाहे कोई भी भारी भार संभाला हो या नहीं) इसका सबसे बड़ा उदाहरण है नथुथ "पेनी-वाइज और पाउंड-मूर्ख" प्रोग्रामर को बुलाता है जो पूरे दिन बिताता है ताकि "अनुकूलित" बना रहे "कोड जो पाउंड से अधिक पैसे बचाने की कोशिश के परिणामस्वरूप एक डिबगिंग दुःस्वप्न में बदल गया। इस तरह के कोड को शायद ही कभी बनाए रखा जा सकता है, पहली जगह में भी कुशल।
क्या वह सही है?
वह बहुत बुनियादी दक्षता के नजरिए से सही है। मेरी जानकारी के लिए कोई भी कंपाइलर वस्तुओं को शामिल करने वाले पॉलीमॉर्फिक कोड और डायनामिक डिस्पैच को स्विच स्टेटमेंट से बेहतर नहीं बना सकता है। आप कभी भी LUT या जंप टेबल के साथ पॉलीमॉर्फ़िक कोड से इनलाइन कोड को समाप्त नहीं करेंगे, क्योंकि ऐसा कोड कंपाइलर के लिए एक अनुकूलक अवरोधक के रूप में काम करता है (यह पता नहीं चलेगा कि डायनामिक डिस्पैच के समय तक किस फ़ंक्शन को कॉल करना है। होता है)।
जम्प टेबल के संदर्भ में इस लागत के बारे में नहीं बल्कि अनुकूलन अवरोध के संदर्भ में यह अधिक उपयोगी है। बहुरूपता के लिए, कॉलिंग Base.method()
संकलक को यह जानने की अनुमति नहीं देता है कि कौन सा फ़ंक्शन वास्तव में कहा जा रहा है यदि method
वर्चुअल है, सील नहीं किया गया है और ओवरराइड किया जा सकता है। चूँकि यह नहीं पता है कि वास्तव में कौन सा फ़ंक्शन कहा जा रहा है, इसलिए यह फ़ंक्शन कॉल को ऑप्टिमाइज़ नहीं कर सकता है और अनुकूलन निर्णय लेने में अधिक जानकारी का उपयोग कर सकता है, क्योंकि यह वास्तव में नहीं जानता है कि किस फ़ंक्शन को कहा जा रहा है। जिस समय कोड संकलित किया जा रहा है।
ऑप्टिमाइज़र अपने सबसे अच्छे रूप में होते हैं जब वे एक फ़ंक्शन कॉल में सहकर्मी कर सकते हैं और अनुकूलन कर सकते हैं जो या तो कॉलर और कैली को पूरी तरह से समतल कर देगा, या कम से कम कॉल करने वाले को कॉल्ली के साथ सबसे कुशलता से काम करने के लिए अनुकूलित कर सकता है। वे ऐसा नहीं कर सकते हैं यदि वे नहीं जानते कि कौन सा कार्य वास्तव में पहले से कहा जा रहा है।
वह सिर्फ अपने गधे बाहर बात कर रहा है?
इस लागत का उपयोग करना, जो अक्सर पेनीज़ के लिए होता है, इसे समान रूप से लागू कोडिंग मानक में बदलने का औचित्य साबित करने के लिए आम तौर पर बहुत मूर्खतापूर्ण होती है, विशेष रूप से उन स्थानों के लिए जिनकी एक अत्यधिक आवश्यकता होती है। मुख्य बात यह है कि आप वास्तविक समय से पहले के ऑप्टिमाइज़र के साथ देखना चाहते हैं: वे मामूली प्रदर्शन चिंताओं को कोडिंग मानकों में बदलना चाहते हैं जो समान रूप से एक कोडबेस में समान रूप से लागू किए गए हैं जो कि स्थिरता बनाए रखने के लिए कोई संबंध नहीं है।
मैं स्वीकार किए गए उत्तर में उपयोग किए गए "पुराने सी हैकर" उद्धरण के लिए थोड़ा अपराध लेता हूं, क्योंकि मैं उनमें से एक हूं। हर कोई जो बहुत सीमित हार्डवेयर से शुरू होने वाले दशकों से कोडिंग कर रहा है, एक समय से पहले के ऑप्टिमाइज़र में बदल गया है। फिर भी मैंने उनका सामना किया और उन लोगों के साथ भी काम किया। लेकिन वे प्रकार कभी शाखा की मिसप्रिंट या कैश मिस जैसी चीजों को नहीं मापते हैं, उन्हें लगता है कि वे बेहतर जानते हैं, और अंधविश्वासों पर आधारित एक जटिल उत्पादन कोडबेस में अक्षमता की अपनी धारणा को आधार बनाते हैं जो आज सच नहीं है और कभी-कभी सच नहीं है। जिन लोगों ने वास्तव में प्रदर्शन-महत्वपूर्ण क्षेत्रों में काम किया है, वे अक्सर समझते हैं कि प्रभावी अनुकूलन प्रभावी प्राथमिकता है, और पेनीज़ को बचाने के लिए एक स्थायित्व-अपमानजनक कोडिंग मानक को सामान्य करने की कोशिश करना बहुत ही अप्रभावी प्राथमिकता है।
पेनीज़ महत्वपूर्ण हैं जब आपके पास एक सस्ता फ़ंक्शन होता है जो इतना काम नहीं करता है जिसे एक बिलकुल तंग, प्रदर्शन-महत्वपूर्ण लूप में एक अरब बार कहा जाता है। उस मामले में, हम 10 मिलियन डॉलर की बचत करते हैं। यह शेविंग पेनीज़ के लायक नहीं है जब आपके पास एक फ़ंक्शन होता है जिसे दो बार कहा जाता है, जिसके लिए अकेले शरीर में हजारों डॉलर खर्च होते हैं। कार खरीदने के दौरान पेनीज़ पर अपना समय व्यतीत करने में समझदारी नहीं है। यदि आप एक निर्माता से सोडा के एक लाख डिब्बे खरीद रहे हैं, तो यह पेनीज़ के लिए बहुत ही फायदेमंद है। प्रभावी अनुकूलन की कुंजी इन लागतों को उनके उचित संदर्भ में समझना है। कोई है जो हर एक खरीद पर पेनी बचाने की कोशिश करता है और सुझाव देता है कि हर कोई पेनीज़ पर कोई फर्क नहीं पड़ता है कि वे क्या खरीद रहे हैं एक कुशल अनुकूलक नहीं है।