आज के लिए प्रोग्रामर "माइक्रो-ऑप्टिमाइज़" क्या करते हैं? [बन्द है]


14

"अच्छे ol 'दिनों में वापस," जब हम दोस्तों के लिए फ्लॉपियों पर शेयरवेयर कॉपी करेंगे, तो हमने असेंबली बिट का भी इस्तेमाल किया। "माइक्रो-ऑप्टिमाइज़ेशन" की एक सामान्य प्रथा थी, जहाँ आप घूरते और घूरते थे, जब तक कि आप इसे कम निर्देश में व्यक्त करने का कोई तरीका नहीं निकाल लेते। एक कहावत भी थी, जो गणितीय रूप से असंभव थी, कि " आप हमेशा एक और निर्देश को हटा सकते हैं। " यह देखते हुए कि छोटे स्थिर कारकों द्वारा रनटाइम प्रदर्शन को बदलना (अधिकांश) प्रोग्रामिंग के लिए आज एक प्रमुख मुद्दा नहीं है, क्या प्रोग्रामर इन माइक्रो- को स्थानांतरित कर रहे हैं। अनुकूलन के प्रयास कहीं और?

दूसरे शब्दों में, क्या सबसे अच्छा अभ्यास एक चरम स्थिति में ले जाया जा सकता है जहां यह अब मूल्य का कुछ भी नहीं जोड़ रहा है? और इसके बजाय समय बर्बाद कर रहा है?

उदाहरण के लिए: क्या प्रोग्रामर निजी तरीकों को सामान्य करने में समय बर्बाद करते हैं जिन्हें केवल एक ही स्थान से कहा जाता है? क्या समय बर्बाद करने से टेस्ट केस डेटा कम हो जाता है? क्या प्रोग्रामर (अभी भी) कोड की लाइनों को कम करने के बारे में अत्यधिक चिंतित हैं?

नीचे जो मैं देख रहा हूं उसके दो महान उदाहरण हैं: (1) सही चर नामों को खोजने में समय व्यतीत करना, यहां तक ​​कि हर चीज का नाम बदलना; और (2) छोटे और दस कोड के दोहराव को हटाना।


ध्यान दें कि यह प्रश्न " आप किस लिए अनुकूलित करते हैं? " से अलग है, क्योंकि मैं पूछ रहा हूं कि अन्य प्रोग्रामर अधिकतम क्या लगते हैं, इनमें "सूक्ष्म" अनुकूलन के कलंक हैं, और इस तरह समय का उत्पादक उपयोग नहीं है।



@ मैकनेइल, मुझे नहीं पता कि अन्य प्रोग्रामर किसके लिए माइक्रो-ऑप्टिमाइज़ करते हैं, लेकिन मेरे पास इसके लिए ज्यादा समय नहीं है। मेरे सहकर्मी भी व्यस्त हैं (सिर्फ मेरे 2 सेंट)।
जॉब

@ जोब: आपने कभी किसी को अपना समय बर्बाद करते हुए नहीं देखा, बिना किसी कारण के कोड को बदलते हुए? खुद को भाग्यशाली मानें। नीचे दो महान उदाहरण हैं: परिवर्तनीय नाम और मामूली कोड दोहराव।
मैकनील

1
प्रश्न, जैसा कि वर्तमान में कहा गया है, एक सुधार है। मैं करीबी वोट नहीं निकाल सकता, लेकिन यह कुछ दिनों में दूर हो जाएगा। दरअसल, सवाल कुछ अच्छे जवाबों को आकर्षित कर रहा है।
रॉबर्ट हार्वे

1
BTW, किसी भी सर्वोत्तम अभ्यास को इतनी चरम सीमा तक ले जाया जा सकता है कि यह अब मूल्य पैदा नहीं करता है।
रॉबर्ट हार्वे

जवाबों:


22

कोड स्वरूपण

Don't     get    me   wrong             ,
code      should be   consistent        & 
readable                                , 
but       some   take it         too far.

आह हाँ, अच्छे पुराने चर प्रकार और चर नामों को चर घोषणाओं की एक श्रृंखला में अपने कॉलम की आवश्यकता होती है। ओह! शुरुआती के लिए =और चौथे के लिए अतिरिक्त पंक्ति भूल गए !
मैकनील

[डारन,
अपवोट

3
हमारे प्रोफेसरों ने हमें इस तरह से असाइनमेंट के लिए कोड को प्रारूपित करने के लिए मजबूर किया। इस आदत से छुटकारा पाने के लिए मुझे वर्षों लग गए।
ओलिवर वीलर

बाप रे। अन्य उत्तरों पर मैं हँस रहा था, लेकिन यह वास्तव में दर्द देता है :-(
स्टीव 314

2
+1 मैंने एक बार एक पुस्तकालय के साथ काम किया जहां डेवलपर ने अपने कोड को सही बनाने से इनकार कर दिया क्योंकि इसने उसके कॉलम-स्वरूपित कोड को खराब कर दिया ...
डीन हार्डिंग

20

मैं दिन में बहुत से असेंबलर लिखता था। ऐसा नहीं है कि संकलक बेहतर हो गए हैं, यह है कि अधिकांश हार्डवेयर में अब कोड के आउट-ऑफ-ऑर्डर निष्पादन के लिए बहुत सारे तर्क हैं। वास्तविक माइक्रो-इश्यू शेड्यूलिंग है, अधिकांश कंप्यूटर निर्देश परिणाम के उत्पादन के लिए कई मशीन घड़ियां लेते हैं-और एक मेमोरी लोड जो कि कैश को याद करता है कई सौ हो सकता है! इसलिए यह विचार था कि किसी परिणाम के लिए इंतजार करने के बजाय, कुछ उपयोगी करने के लिए अन्य निर्देशों को शेड्यूल किया जाए। और आधुनिक मशीनें प्रति घड़ी की अवधि में कई निर्देश जारी कर सकती हैं। एक बार जब हम आउट-ऑफ-ऑर्डर निष्पादन एचडब्ल्यू शुरू करना शुरू कर दिया, तो मैंने पाया कि हैंड कोडिंग के साथ शानदार प्रदर्शन करने की कोशिश करना एक मग गेम बन गया। पहले आउट-ऑफ-ऑर्डर एचडब्ल्यू आपके ध्यान से तैयार किए गए निर्देशों में निर्देशों को निष्पादित नहीं करेगा, फैंसी नई एचडब्ल्यू आर्किटेक्चर ने इनोफ़ाइम सॉफ्टवेयर के दंड को पर्याप्त रूप से कम कर दिया है कि कंपाइलर आमतौर पर आपके प्रदर्शन के कुछ प्रतिशत के भीतर होता है। इसके अलावा मुझे पता चला कि कंपाइलर अब जाने-माने लेकिन जटिलता पैदा करने वाली तरकीबें लागू कर रहे थे, जैसे कि अनरोलिंग, बॉटम लोडिंग, सॉफ्टवेयर पाइपलाइनिंग आदि। नीचे की लाइन, आपको वास्तव में कड़ी मेहनत करनी है, इनमें से कुछ ट्रिक्स को छोड़ दें और कंपाइलर आपको हरा देता है। उन सभी का उपयोग करें और कोडांतरक निर्देशों की संख्या आपको कई गुना बढ़ाने की आवश्यकता है!

संभवतः और भी महत्वपूर्ण, अधिकांश प्रदर्शन मुद्दे, निर्देश जारी करने की दरों के बारे में नहीं हैं, लेकिन सीपीयू में डेटा प्राप्त कर रहे हैं। जैसा कि मैंने ऊपर उल्लेख किया है, मेमोरी विलंबता अब सैकड़ों चक्र है, और सीपीयू प्रति घड़ी की अवधि में कई निर्देश निष्पादित कर सकता है, इसलिए जब तक कि प्रोग्राम-विशेष रूप से डेटा संरचनाएं डिज़ाइन नहीं की जाती हैं ताकि कैश हिट दर अत्यधिक उच्च हो, निर्देश पर माइक्रोटुनिंग स्तर का कोई भुगतान नहीं होगा। जैसे सैन्य प्रकार के लोग कहते हैं कि शौकीनों की बात रणनीति, पेशेवरों की रसद बात करती है। प्रदर्शन प्रोग्रामिंग अब 90% से अधिक लॉजिस्टिक्स (मूविंग डेटा) है। और यह निर्धारित करना कठिन है, क्योंकि आधुनिक मेमोरी प्रबंधन में आमतौर पर कैश के कई स्तर होते हैं, और वर्चुअल मेमोरी पेजों को एक हार्डवेयर यूनिट द्वारा नियंत्रित किया जाता है जिसे टीएलबी कहा जाता है। इसके अलावा पतों का लोवेल एलाइनमेंट महत्वपूर्ण हो जाता है, क्योंकि वास्तविक डेटा ट्रांसफर बाइट्स की इकाइयों में नहीं होते हैं, या यहां तक ​​कि 64 बिट लंबे-लंबे, लेकिन वे कैश लाइनों की इकाइयों में आते हैं। तब अधिकांश आधुनिक मशीनों में हार्डवेयर होते हैं जो यह अनुमान लगाने की कोशिश करते हैं कि कौन सी कैश लाइन याद आती है जो आपको निकट भविष्य में आवश्यकता हो सकती है और उन्हें कैश में लाने के लिए स्वचालित प्रीफ़ेट जारी करें। तो वास्तविकता यह है कि आधुनिक सीपीयू के प्रदर्शन मॉडल इतने जटिल होते हैं कि लगभग बिना समझने के। यहां तक ​​कि विस्तृत हार्डवेयर सिमुलेटर कभी भी चिप्स के सटीक तर्क से मेल नहीं खा सकते हैं, इसलिए सटीक ट्यूनिंग बस अब असंभव है।

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


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

कई कंप्यूटर भाषाएँ प्रोग्रामर को सूक्ष्म रूप से सूक्ष्म अनुकूलन के लिए धक्का देती हैं, जिससे यह गणना के लिए दोहरी परिशुद्धता का उपयोग करने के लिए एक दर्द होता है जिसके परिणामों को प्रस्तुत किया जाएगा float। किसी कारण से मैं थाह नहीं पा सकता, बहुत से लोग सोचते हैं कि यह एक अच्छी बात है।
सुपरकैट

11

मैं कभी-कभी एक चर या विधि के लिए एक अच्छा नाम चुनते समय (बेकार?) समय व्यतीत करता हूं ताकि यह न केवल वर्णनात्मक हो, बल्कि एक अच्छी भाषाई शैली भी हो।

यह थोड़ा और आगे बढ़ जाता है जब मैं पूरे कार्यों (एक कार्यक्रम) को एक ही भाषाई शैली में ढालने का प्रयास करता हूं। कभी-कभी मेरी राय बदल जाती है और मैं पुस्तक को संशोधित करता हूं। :)

नहीं, इसमें इतना समय लगता है। यह दुर्लभ है। लेकिन मैं अपने कार्यक्रमों में अच्छा व्याकरण रखना पसंद करता हूं।


3
नामकरण कठिन है। इसलिए जब आप एक बेहतर के बारे में सोचते हैं तो आपको एक नाम वापस लेना चाहिए। ध्यान दें कि यह मन के प्रयास को पकड़ लेता है, और उम्मीद है कि "क्यों" का भी क्रिस्टलीकरण करें।

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

7
परिवर्तनीय और विधि का नामकरण स्थिरता का एक महत्वपूर्ण हिस्सा है। एक चाहिए समय सोच नामों के बारे में खर्च करते हैं, तो अब से कि 5 साल, व्यक्ति कोड को बनाए रखने के साथ यह एक आसान समय है।
ग्रैंडमास्टरबी

@grandmaster: अधिक सहमत नहीं हो सका।
रॉबर्ट हार्वे

4
@ राइट-ब्रेनर्स: कृपया lef-tbrainers के लिए कोड, इसलिए मैं आपके कोड को भी पढ़ सकता हूं
जुआन मेंडेस

10

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

मैं अभी भी जाने के लिए बहुत जुनूनी हूँ, लेकिन यह उस बड़ी 'हड्डी को विकसित कर सकता है, तब भी जब अन्य डिजाइन निर्णय वास्तविक रूप से हो रहे हैं।

हालांकि, मेरे बचाव में, अवास्तविक वास्तविकता बननी चाहिए .. अनुकूलन वास्तव में 'सूक्ष्म' नहीं है। ध्यान दें, मैंने असंभव नहीं कहा , लेकिन अवास्तविक

बेशक, आवश्यकताएं पूर्वता लेती हैं।


1
मैंने एक कंपनी के लिए काम किया जो इस वजह से डूब गई।
हेनरी

2
@Henry - मैं वादा करता हूँ, है ना मैं था :)
टिम पोस्ट

1
@Henry: तुम्हारा मतलब है कि वे समय बर्बाद चीजें हैं जो की संभावना ऐसा कभी नहीं होता के लिए अनुकूलन, या वे नहीं किया चीजें हैं जो की संभावना हो "कभी नहीं" हैं के बारे में सोचना ... जब तक वे किया हुआ है और यह बहुत देर हो चुकी थी?
डीन हार्डिंग

2
@ हेनरी: यदि किसी कंपनी के पास अत्यधिक स्केलेबल उत्पाद है और अभी भी डूब गया है, तो यह बिक्री और विपणन की गलती है (उच्च मात्रा वाले ग्राहकों को लक्षित नहीं करना और उचित मूल्य निर्धारण नहीं करना), विकास का नहीं।
rwong

2
जब कंपनी के पास 1 उपयोगकर्ता नहीं था, तब कंपनी ने लाखों उपयोगकर्ताओं के लिए एक सिस्टम डिजाइन करने में बहुत समय बिताया। यह मार्केटिंग की गलती रही होगी। हाँ चलो विपणन को दोष देते हैं, वे लोग बेवकूफ हैं।
हेनरी

8

मुझे लगता है कि मैंने जावा अपवाद संचालकों के साथ समय बर्बाद करने के हफ्तों को बर्बाद कर दिया है।

यह कोड के लिए बहुत काम है जो प्रति वर्ष दो या तीन बार विफल होता है। क्या यह एक चेतावनी या एक जानकारी होनी चाहिए? त्रुटि या घातक? क्या यह वास्तव में घातक है कि यह प्रक्रिया पांच मिनट में फिर से शुरू हो जाएगी? क्या यह वास्तव में एक चेतावनी है यदि सब कुछ अभी भी डिफ़ॉल्ट स्थिति में है?

एक IO त्रुटि की प्रकृति के बारे में नाभि टकटकी और चर्चा के बहुत सारे। यदि आप नेटवर्क पर कोई फ़ाइल नहीं पढ़ सकते हैं, तो क्या यह फ़ाइल त्रुटि या नेटवर्क त्रुटि है? और इसी तरह।

एक बिंदु पर मैंने सभी कॉनसैट स्ट्रिंग्स को बदल दिया String.formatताकि वार्षिक फाइल त्रुटि ढेर में अतिरिक्त वस्तुओं के परिणामस्वरूप न हो। वह बर्बादी थी।


3
यह महत्वपूर्ण कार्य है। विफलता की कीमत = आपका त्रुटि संदेश दैनिक डब्ल्यूटीएफ पर चित्रित किया जा रहा है।
स्टीव 314

7

मुझे लगता है कि मैं LOCs से बहुत अधिक चिंतित हूं। इतना LOCs खुद नहीं, बल्कि बयानों की संख्या और यहां तक ​​कि अधिक संख्या में डुप्लिकेट स्टेटमेंट भी। मुझे डुप्लिकेट कोड से एलर्जी है। सामान्य तौर पर मैं रिफैक्टरिंग से प्यार करता हूं, लेकिन मैं 50% के बारे में मानता हूं कि मैं क्या नहीं करता कोड को स्पष्ट रूप से अच्छे नहीं बनाते हैं।


4
+1 के लिए "मुझे डुप्लिकेट कोड से एलर्जी है"। मेरा जवाब यहां भी देखें: प्रोग्रामर.स्टैकएक्सचेंज
com

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

5

पूरी लाइन को एक स्ट्रिंग में पढ़ने के बजाय लाइन द्वारा एक फ़ाइल लाइन पढ़ना और स्ट्रिंग को एक ही बार में संसाधित करना।

निश्चित रूप से, यह निष्पादन की गति में अंतर करता है, लेकिन शायद ही कभी कोड की अतिरिक्त लाइनों के लायक है। यह कोड को काफी कम बनाए रखता है और कोड आकार को बढ़ाता है।

हां, यह शायद समझ में नहीं आता है यदि फ़ाइल 3GB बड़ी है, लेकिन अधिकांश फाइलें इतनी बड़ी नहीं हैं (कम से कम मैं उन लोगों के साथ काम नहीं कर रहा हूं जो ;-))।


3
भले ही यह 3GB या उससे अधिक हो, 64-बिट मशीन इसे वर्चुअल मेमोरी के साथ संभाल सकती है। एक मेमोरी मैप्ड फ़ाइल का उपयोग करें और यह आपकी फ़ाइल के किसी भी हिस्से को तब तक नहीं पढ़ेगा जब तक इसकी आवश्यकता न हो। आप पर ध्यान दें, यहां तक ​​कि सामान्य मामले में सूक्ष्म अनुकूलन भी।
223 पर स्टीव 314

3

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

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

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

सामान्य तौर पर मैं वर्षों के अनुभव के आधार पर, मैं कोड लिखने के लिए स्मार्ट होने की कोशिश करता हूं।


हाय ग्रेग, इस उत्तर के लिए धन्यवाद, लेकिन मैं देख रहा हूं कि प्रोग्रामर समय बर्बाद करने के लिए करते हैं , रनटाइम प्रदर्शन का अनुकूलन करने के लिए नहीं। ऊपर दो महान उदाहरण हैं: चर नाम और मामूली कोड दोहराव को हटाना।
मैकनील

3

एक माइक्रो-ऑप्टिमाइज़ेशन: सामानों के एकल-थ्रेडेड प्रदर्शन में सुधार करना जो कि समानांतर हैं या जो केवल नए हार्डवेयर के साथ सुधार किया जा सकता है।

यदि 10 साल पहले के कंप्यूटर पर कुछ धीमा है, तो एक सस्ता समाधान शायद एक नया, तेज कंप्यूटर खरीदने के लिए है, बजाय प्रोग्रामर के समय के अनुकूलन के। हालाँकि, अनुकूलन पर एक बड़ा ध्यान केंद्रित किया जाना चाहिए, हालांकि, आज मिलने वाले 8 कोर का उपयोग करने का एक तरीका खोजा जाना चाहिए, या 64 जो आप कुछ वर्षों में प्राप्त कर पाएंगे, बजाय इसके कि कचरे की अतिरिक्त लागत जैसे minutia के बारे में। संग्रह।


2

रनटाइम प्रदर्शन के मामले में माइक्रो-ऑप्टिमाइज़ेशन शायद ही आज भी एक बंद समस्या है (हालाँकि यह कम आम हो सकता है)। मुझे कभी-कभी लोगों को यह समझाना पड़ता है कि हर अनुरोध पर एक अतिरिक्त ऑब्जेक्ट आवंटित करने या अतिरिक्त फ़ंक्शन कॉल को जोड़ने का ओवरहेड नगण्य है।

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


प्रोग्रामर क्यों करेंगे। कोई अलग हो? क्या अंतर है, कृपया
डैन रोसेनस्टार्क

@ यार - प्रोग्रामर किसी से अलग क्यों होंगे?
जेसन बेकर

क्यों programmers.= programmers.stackexchange.comआप हर उस जगह से अलग होंगे जो आपने काम किया है, जहाँ आपको इन दोनों अवधारणाओं के बीच के अंतर को स्पष्ट करना है? कृपया अंतर स्पष्ट करें।
दान रोसेनस्टार्क

@ यार - मुझे नहीं पता कि यह होगा। वास्तव में, programmers.se की बात के रूप में प्रोग्रामर पूल ज्ञान में मदद करने के लिए है, मुझे उम्मीद है कि ऐसा नहीं है कि लोगों को कम से कम मेरे जवाब से प्रबुद्ध हो सकता है।
जेसन बेकर

2
तो क्या अंतर है b / t सादगी और सरलता?
डैन रोसेनस्टार्क

2

मैं सभी के लिए नहीं-अनुकूलन-जब तक-वास्तव में आवश्यक सिद्धांत नहीं हूं। और मैं प्रोफाइल-प्रथम सिद्धांत के लिए हूं। और सिद्धांत रूप में, मैं केवल कुछ का अनुकूलन करूंगा जो एक आवश्यक अंतर बना देगा।

वह सिद्धांत रूप में है। लेकिन सिद्धांत एक झूठा है।

मुझे अक्सर इस्तेमाल किए जाने वाले पुस्तकालयों में कार्यों के साथ देखभाल करने की आदत है जो मुझे लगता है कि आंतरिक छोरों में बहुत उपयोग किया जाएगा। और फिर, जब आप किसी अन्य फ़ंक्शन में कुछ स्पॉट करते हैं, तो ऐसा अक्सर उपयोग नहीं किया जाता है ...

ओह - और फिर "मैं इसे लिख रहा हूं - बेशक यह एक महत्वपूर्ण पुस्तकालय है" तर्क।

ओह - और BTW। मैंने अभी तक अनुकूलन का मार्गदर्शन करने के लिए प्रोफाइलर का उपयोग नहीं किया है। एक वाणिज्यिक तक पहुंच नहीं है, और कभी भी पर्याप्त जानकारी का निर्माण नहीं किया है।

असल में, मैं एक पाखंडी हूँ। ये सिद्धांत अन्य लोगों पर लागू होते हैं, लेकिन मुझे किसी को यह कहते हुए बहुत अधिक डर है "लेकिन आपने इसे धीमा और भद्दा तरीका क्यों लिखा है?" इसलिए मैं वास्तव में उन्हें कभी भी अपने लिए सही तरीके से लागू नहीं कर सकता।

मैं वास्तव में उतना बुरा नहीं हूँ जितना मैं यहाँ हूँ, हालाँकि। और मैं आत्म-धोखे से पूरी तरह से मुक्त हूं, इसलिए आप जानते हैं कि मैं इसके बारे में सही हूं!

संपादित करें

मुझे जोड़ना चाहिए - मेरे प्रमुख बेवकूफ हैंग-अप कॉल ओवरहेड्स हैं। हर जगह नहीं, निश्चित रूप से, लेकिन उन I-think-it-be-be-used-a-lot-of-in-loops मामलों में (जहाँ मेरे पास समस्या का कोई वस्तुनिष्ठ प्रमाण नहीं है)। मैंने एक से अधिक बार वर्चुअल मेथड कॉल करने से बचने के लिए गंदा ऑफ़सेट-आधारित कोड लिखा है। परिणाम भी, धीमी हो, क्योंकि यह शायद कोडिंग कि optimisers अच्छी तरह से निपटने के लिए तैयार कर रहे हैं की एक शैली नहीं है हो सकता है - लेकिन यह के चालाक ;-)


+1 आह, हाँ! यह वर्ग मेरे आवेदन के अत्यधिक विशिष्ट और विचित्र कमांड-लाइन तर्कों को पार्स करता है, लेकिन मुझे प्रारूप और पूरी तरह से दस्तावेज दें जब जावदोक, क्योंकि निश्चित रूप से अन्य लोग वर्षों से इसका उपयोग करेंगे! [बाद में
उत्थान

@ मैकनेइल - वह डॉक्सीजेन है, मुझे पता होगा। हर विकल्प के साथ मैं स्विच ऑन पा सकता हूं, इसलिए हर छोटे फ़ंक्शन को एक दर्जन सुंदर ग्राफ़विज़ ग्राफ़ के साथ पूरा करने के लिए विस्तार से "प्रलेखित" हो जाता है। वास्तव में हर किसी की सराहना करने में मदद करता है कि मेरा कोड कितना महत्वपूर्ण है - और प्रिंट-आउट काफी बड़े कार्यालय ब्लॉक को वॉलपेपर कर सकता है।
स्टीव 314

1

पुराने दिनों में जब कंप्यूटरों ने घड़ी को माइक्रोसेकंड में मापा जाता था, मेमोरी को किलोबाइट्स में मापा जाता था, और आदिम संकलक, माइक्रो-ऑप्टिमाइज़ेशन ने कुछ अर्थ दिया।

वर्तमान पीढ़ी के कंप्यूटरों की गति और आकार और वर्तमान पीढ़ी के संकलक की गुणवत्ता का मतलब है कि सूक्ष्म अनुकूलन आमतौर पर समय की कुल बर्बादी है। अपवाद तब होते हैं जब आपको पूरी तरह से कुछ कम्प्यूटेशनल गहन कोड से अधिकतम प्रदर्शन प्राप्त करना होता है ... या आप बेहद सीमित संसाधनों के साथ एक एम्बेडेड सिस्टम के लिए लिख रहे हैं।

लेकिन मैं देख रहा हूँ कि प्रोग्रामर समय बर्बाद करने के लिए क्या करते हैं, रनटाइम प्रदर्शन को अनुकूलित करने के लिए नहीं।

ट्विटर और फेसबुक वसंत के लिए मन :-)


हाय स्टीफन, जो कि माइक्रो-ऑप्टिमाइज़ेशन पर एक महान टिप्पणी है, लेकिन क्या आप किसी आधुनिक दिन के समकक्ष देखते हैं? [फेसबुक और ट्विटर "बेस्ट प्रैक्टिस" नहीं हैं जिन्हें बहुत दूर तक ले जाया जा सकता है।]
मैकनील

यह अभी भी समझ में आता है। घड़ी का समय परिमाण का आदेश छोटा हो सकता है, लेकिन कोड परिमाण का क्रम बड़ा होता है ...
hplbsh

@ स्टुअर्ट - इसका मतलब है कि माइक्रो-ऑप्टिमाइज़ेशन के लिए अधिक कोड परिमाण के आदेश हैं ... जो बस पैमाने पर नहीं है।
स्टीफन सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.