यह ध्यान देने योग्य है कि नुथ का मूल उद्धरण एक पेपर से आया था जिसे उन्होंने goto
सावधानीपूर्वक चयनित और मापा क्षेत्रों में हॉटस्पॉट को खत्म करने के तरीके के उपयोग को बढ़ावा देते हुए लिखा था । उनकी बोली एक चेतावनी थी जिसमें उन्होंने अपने तर्क को उचित बनाने के लिए अपने तर्क को सही ठहराने के लिए जोड़ा goto
।
[...] फिर से, यह समग्र चलने की गति में एक ध्यान देने योग्य बचत है, अगर, कहते हैं, n का औसत मूल्य लगभग 20 है, और यदि कार्यक्रम में खोज दिनचर्या लगभग एक मिलियन या इतनी बार की जाती है। ऐसे लूप ऑप्टिमाइज़ेशन [उपयोग करना gotos
] सीखना मुश्किल नहीं है और, जैसा कि मैंने कहा है, वे एक कार्यक्रम के सिर्फ एक छोटे से हिस्से में उपयुक्त हैं, फिर भी वे अक्सर पर्याप्त बचत प्राप्त करते हैं। [...]
और जारी है:
आज के कई सॉफ्टवेयर इंजीनियरों द्वारा साझा किए गए पारंपरिक ज्ञान छोटे में दक्षता की अनदेखी करने के लिए कहते हैं; लेकिन मेरा मानना है कि यह केवल उन दुर्व्यवहारों के लिए एक अतिशयोक्ति है जो वे पेनीवाइज़-एंड-पाउंड-मूर्ख प्रोग्रामर द्वारा अभ्यास किए जा रहे हैं, जो अपने "अनुकूलित" कार्यक्रमों को डिबग या बनाए नहीं रख सकते हैं। स्थापित इंजीनियरिंग में एक 12% सुधार आसानी से प्राप्त होता है, इसे कभी भी मामूली नहीं माना जाता है; और मेरा मानना है कि सॉफ्टवेयर इंजीनियरिंग में समान दृष्टिकोण होना चाहिए। निश्चित रूप से मैं इस तरह के अनुकूलन को ऑनशॉट जॉब में परेशान नहीं करूंगा, लेकिन जब यह गुणवत्ता कार्यक्रमों को तैयार करने का सवाल है, तो मैं खुद को ऐसे टूल तक सीमित नहीं रखना चाहता जो मुझे इस तरह की क्षमता से वंचित करते हैं [अर्थात, goto
इस संदर्भ में कथन]।
ध्यान रखें कि उन्होंने उद्धरणों में "अनुकूलित" का उपयोग कैसे किया (सॉफ्टवेयर शायद वास्तव में कुशल नहीं है)। यह भी ध्यान दें कि कैसे वह सिर्फ इन "पेनीवाइज़-एंड-पाउंड-मूर्ख" प्रोग्रामर की आलोचना नहीं कर रहा है, बल्कि यह भी कि जो लोग आपको सुझाव देकर प्रतिक्रिया देते हैं, उन्हें हमेशा छोटी अक्षमताओं को अनदेखा करना चाहिए। अंत में, अक्सर उद्धृत भाग के लिए:
इसमें कोई संदेह नहीं है कि दक्षता की कब्र दुरुपयोग की ओर ले जाती है। प्रोग्रामर अपने कार्यक्रमों के गैर-महत्वपूर्ण हिस्सों की गति के बारे में सोचने या चिंता करने में बहुत समय बर्बाद करते हैं, और दक्षता पर इन प्रयासों का वास्तव में एक मजबूत नकारात्मक प्रभाव पड़ता है जब डिबगिंग और रखरखाव पर विचार किया जाता है। हमें छोटी दक्षता के बारे में भूल जाना चाहिए, समय का 97% कहना चाहिए; सभी बुराईयो की जड़ समयपूर्व इष्टतमीकरण है।
... और फिर प्रोफाइलिंग टूल्स के महत्व के बारे में कुछ और बातें:
यह अक्सर एक प्राथमिकता निर्णय लेने के लिए एक गलती है कि कार्यक्रम के कौन से हिस्से वास्तव में महत्वपूर्ण हैं, क्योंकि माप उपकरणों का उपयोग करने वाले प्रोग्रामर का सार्वभौमिक अनुभव यह रहा है कि उनके सहज अनुमान विफल हो जाते हैं। सात वर्षों तक ऐसे उपकरणों के साथ काम करने के बाद, मुझे विश्वास हो गया है कि अब से लिखे गए सभी कंपाइलरों को सभी प्रोग्रामरों को फीडबैक प्रदान करने के लिए डिज़ाइन किया जाना चाहिए, जो यह दर्शाता है कि उनके कार्यक्रमों के कौन से हिस्से सबसे अधिक लागत वाले हैं; वास्तव में, यह प्रतिक्रिया स्वचालित रूप से आपूर्ति की जानी चाहिए जब तक कि इसे विशेष रूप से बंद नहीं किया गया हो।
लोगों ने जगह-जगह उनके उद्धरण का दुरुपयोग किया है, अक्सर यह सुझाव देते हैं कि माइक्रो-ऑप्टिमाइज़ेशन समयपूर्व हैं जब उनका पूरा पेपर माइक्रो-ऑप्टिमाइज़ेशन की वकालत कर रहा था! लोगों के एक समूह की वह आलोचना कर रहा था, जो इस "पारंपरिक ज्ञान" की प्रतिध्वनि करता है, क्योंकि वह हमेशा छोटे लोगों में दक्षता की अनदेखी करता है, अक्सर अपने उद्धरण का दुरुपयोग कर रहे हैं, जो मूल रूप से निर्देशित किया गया था, इस प्रकार के खिलाफ, जो सभी प्रकार के सूक्ष्म-अनुकूलन को हतोत्साहित करते हैं। ।
फिर भी यह उचित रूप से लागू माइक्रो-ऑप्टिमाइज़ेशन के पक्ष में एक उद्धरण था जब एक प्रोफाइलर को पकड़े हुए एक अनुभवी हाथ द्वारा उपयोग किया जाता था। आज का अनुरूप समतुल्य हो सकता है, "लोगों को अपने सॉफ़्टवेयर के अनुकूलन के लिए अंधा आधार नहीं लेना चाहिए, लेकिन संदर्भ के स्थानीयता में सुधार करने के लिए महत्वपूर्ण क्षेत्रों में लागू होने पर कस्टम मेमोरी एलोकेटर एक बड़ा अंतर ला सकते हैं," या, " हस्तलिखित SIMD कोड का उपयोग करके SoA rep वास्तव में बनाए रखने के लिए कठिन है और आपको इसे पूरे स्थान पर उपयोग नहीं करना चाहिए, लेकिन जब यह एक अनुभवी और निर्देशित हाथ द्वारा उचित रूप से लागू किया जाता है, तो यह बहुत तेज़ी से मेमोरी का उपभोग कर सकता है। "
किसी भी समय आप ध्यान से लागू सूक्ष्म-अनुकूलन को बढ़ावा देने की कोशिश कर रहे हैं, जैसा कि नुथ ने ऊपर पदोन्नत किया है, यह नौसिखियों को हतोत्साहित करने के लिए एक अस्वीकरण में फेंकना अच्छा है और अनुकूलन पर स्टैब्स लेने के लिए, अपने संपूर्ण सॉफ़्टवेयर का उपयोग करने के लिए पुनर्लेखन की तरह goto
। वह भाग में है कि वह क्या कर रहा था। उनका उद्धरण प्रभावी रूप से एक बड़े डिस्क्लेमर का एक हिस्सा था, जैसे कि किसी ने ज्वलंत आग के गड्ढे पर मोटरसाइकिल जंप किया हो, एक अस्वीकरण जोड़ सकता है कि शौकीनों को घर पर यह कोशिश नहीं करनी चाहिए, साथ ही साथ उन लोगों की आलोचना भी करनी चाहिए जो बिना उचित ज्ञान और उपकरणों के प्रयास करते हैं और चोटिल हो जाते हैं। ।
उन्होंने माना कि "समय से पहले अनुकूलन" उन लोगों द्वारा लागू किए गए अनुकूलन थे जो प्रभावी रूप से नहीं जानते थे कि वे क्या कर रहे थे: पता नहीं था कि क्या अनुकूलन वास्तव में आवश्यक था, उचित उपकरणों के साथ माप नहीं किया गया था, शायद प्रकृति की समझ में नहीं आया था उनके कंपाइलर या कंप्यूटर आर्किटेक्चर, और सबसे अधिक, "पेनीवाइज-एंड-पाउंड-मूर्ख" थे, जिसका अर्थ है कि उन्होंने पेनीज़ को चुटकी लेने की कोशिश करके (लाखों डॉलर बचाने के लिए) बड़े अवसरों की अनदेखी की, और सभी को कोड बनाते समय वे नहीं कर सकते हैं अब प्रभावी रूप से डिबग और रखरखाव।
यदि आप "पैसा-और-पाउंड-मूर्ख" श्रेणी में फिट नहीं होते हैं, तो आप समय से पहले नथ के मानकों का अनुकूलन नहीं कर रहे हैं, भले ही आप goto
एक महत्वपूर्ण लूप को गति देने के लिए एक का उपयोग कर रहे हों (ऐसा कुछ जिसकी संभावना नहीं है आज के ऑप्टिमाइज़र के खिलाफ बहुत मदद करने के लिए, लेकिन अगर यह किया, और वास्तव में महत्वपूर्ण क्षेत्र में, तो आप समय से पहले अनुकूलन नहीं करेंगे)। यदि आप वास्तव में उन सभी क्षेत्रों में आवेदन कर रहे हैं जो आप उन क्षेत्रों में कर रहे हैं जो वास्तव में आवश्यक हैं और वे वास्तव में इससे लाभान्वित हैं, तो आप नूथ की नज़र में सिर्फ महान काम कर रहे हैं।