क्या कोड लिखने की कार्यप्रणाली में क्रमिक बदलाव ने प्रणाली के प्रदर्शन को प्रभावित किया? और क्या मुझे परवाह करनी चाहिए?


35

टीडी, डॉ:

मैं जो पूछ रहा था, उसके बारे में कुछ भ्रम था, इसलिए यहां सवाल के पीछे ड्राइविंग विचार है:

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

और सवाल यह नहीं है ...

माइक्रो-ऑप्टिमाइज़ेशन, प्रीमेच्योर ऑप्टिमाइज़ेशन इत्यादि के बारे में नहीं। यह "इस या उस हिस्से को मौत के लिए ऑप्टिमाइज़ करने" के बारे में नहीं है।

तो यह क्या है?

यह समग्र कार्यप्रणाली और तकनीकों और लेखन कोड के बारे में सोचने के तरीकों के बारे में है जो समय के साथ उभरा है:

  • "इस कोड को एक निर्भरता के रूप में अपनी कक्षा में इंजेक्ट करें"
  • "प्रति वर्ग एक फ़ाइल लिखें"
  • "अपने डेटाबेस, नियंत्रक, डोमेन से अपना दृष्टिकोण अलग करें"।
  • स्पेगेटी समरूप एकल कोडब्लॉक न लिखें, बल्कि कई अलग-अलग मॉड्यूलर घटक लिखें जो एक साथ काम करते हैं

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

मूल प्रश्न इस प्रकार है:

कंप्यूटर विज्ञान के क्षेत्र में, मैंने यह सोचकर एक उल्लेखनीय बदलाव पर ध्यान दिया है जब यह प्रोग्रामिंग की बात आती है। मैं बहुत बार इस तरह की सलाह पर आता हूं:

  • छोटे फ़ंक्शन-वार कोड (अधिक परीक्षण योग्य और इस तरह बनाए रखने योग्य) लिखें
  • जब तक आपके अधिकांश तरीके / कार्य केवल कुछ पंक्तियाँ नहीं हैं, तब तक कोड के छोटे और छोटे खंडों में रिफ्लेक्टर विद्यमान होता है और यह स्पष्ट होता है कि उनका उद्देश्य क्या है (जो एक बड़े अखंड ब्लॉक की तुलना में अधिक कार्य करता है)
  • फ़ंक्शंस लिखें जो केवल एक काम करते हैं - चिंताओं को अलग करना, आदि (जो आमतौर पर एक स्टैक पर अधिक फ़ंक्शन और अधिक फ़्रेम बनाता है)
  • अधिक फ़ाइलें बनाएँ (एक वर्ग प्रति फ़ाइल, अपघटन उद्देश्यों के लिए अधिक कक्षाएं, परत उद्देश्यों के लिए जैसे MVC, डोमेन आर्किटेक्चर, डिज़ाइन पैटर्न, OO, आदि, जो अधिक फ़ाइल सिस्टम कॉल बनाता है)

यह "पुरानी" या "आउटडेटेड" या "स्पेगेटी" कोडिंग प्रथाओं की तुलना में एक बदलाव है जहां आपके पास 2500 लाइनें फैले हुए तरीके हैं, और बड़े वर्ग और देव वस्तुएं सब कुछ कर रही हैं।

मेरा सवाल यह है:

जब यह कॉल मशीन कोड के लिए 1s और 0s तक, विधानसभा निर्देशों के लिए, HDD प्लेटर्स के लिए आती है, तो क्या मुझे इस बात से चिंतित होना चाहिए कि मेरे छोटे-से-छोटे कार्यों और तरीकों की विविधता के साथ मेरा पूरी तरह से अलग-अलग OO कोड अलग है? बहुत अतिरिक्त उपरि?

विवरण

हालांकि मैं इस बात से परिचित नहीं हूं कि OO कोड और इसकी विधि कॉल अंत में ASM में कैसे नियंत्रित की जाती हैं, और कैसे DB कॉल और कंपाइलर कॉल HDD थाली पर चलती एक्ट्यूएटर आर्म में अनुवाद करते हैं, मुझे कुछ पता नहीं है। मैं मानता हूं कि प्रत्येक अतिरिक्त फ़ंक्शन कॉल, ऑब्जेक्ट कॉल, या "#include" कॉल (कुछ भाषाओं में), निर्देशों का एक अतिरिक्त सेट उत्पन्न करता है, जिससे कोड की मात्रा बढ़ रही है और विभिन्न "कोड वायरिंग" ओवरहेड्स को जोड़कर, वास्तविक "उपयोगी" कोड जोड़े बिना। । मैं यह भी कल्पना करता हूं कि हार्डवेयर पर वास्तव में चलने से पहले एएसएम के लिए अच्छे अनुकूलन किए जा सकते हैं, लेकिन यह अनुकूलन केवल इतना ही कर सकता है।

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

स्पष्टता के लिए अद्यतन करें:

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

यह कहीं कहा गया था (टीबीडी) कि सभी कोड का 70% तक एएसएम के एमओवी निर्देश से बना है - उचित चर के साथ सीपीयू रजिस्टर लोड हो रहा है, वास्तविक गणना नहीं की जा रही है। मेरे मामले में, आप CPU और PUSH / POP निर्देशों के साथ कोड और विभिन्न कोड के बीच गुजरने वाले पैरामीटर प्रदान करने के लिए लोड करते हैं। छोटे आप अपने कोड के टुकड़े बनाते हैं, अधिक उपरि "लिंकेज" की आवश्यकता होती है। मुझे चिंता है कि यह लिंकेज सॉफ्टवेयर ब्लोट और स्लो-डाउन में जुड़ जाता है और मैं सोच रहा हूं कि क्या मुझे इस बारे में चिंतित होना चाहिए, और कितना, यदि कोई हो, तो वर्तमान और भावी पीढ़ी के प्रोग्रामर जो अगली शताब्दी के लिए सॉफ्टवेयर का निर्माण कर रहे हैं। , इन प्रथाओं का उपयोग करके निर्मित सॉफ्टवेयर के साथ रहना और उपभोग करना होगा।

अद्यतन: एकाधिक फ़ाइलें

मैं अब नया कोड लिख रहा हूं जो धीरे-धीरे पुराने कोड की जगह ले रहा है। विशेष रूप से मैंने नोट किया है कि पुरानी कक्षाओं में से एक ~ 3000 लाइन फाइल थी (जैसा कि पहले उल्लेख किया गया है)। अब यह विभिन्न निर्देशिकाओं में स्थित 15-20 फाइलों का एक समूह बनता जा रहा है, जिनमें परीक्षण फाइलें शामिल हैं और PHP फ्रेमवर्क शामिल नहीं है जो मैं कुछ चीजों को एक साथ बांधने के लिए उपयोग कर रहा हूं। और भी फाइलें आ रही हैं। जब डिस्क I / O की बात आती है, तो एक बड़ी फ़ाइल लोड करने की तुलना में कई फ़ाइलों को लोड करना धीमा होता है। बेशक सभी फाइलें लोड नहीं होती हैं, उन्हें आवश्यकतानुसार लोड किया जाता है, और डिस्क कैशिंग और मेमोरी कैशिंग विकल्प मौजूद होते हैं, और फिर भी मेरा मानना ​​है कि स्मृति की loading multiple filesतुलना loading a single fileमें अधिक प्रसंस्करण होता है। मैं इसे अपनी चिंता में शामिल कर रहा हूं।

अद्यतन: निर्भरता सब कुछ इंजेक्ट करें

थोड़ी देर बाद इस पर वापस आ रहा हूं .. मुझे लगता है कि मेरा सवाल गलत था। या शायद मैंने कुछ जवाबों को गलत समझा। मैं माइक्रो-ऑप्टिमाइज़िंग के बारे में बात नहीं कर रहा हूं, क्योंकि कुछ जवाब एकल हो गए हैं, (कम से कम मुझे लगता है कि मैं जो कॉल कर रहा हूं वह माइक्रो-ऑप्टिमाइज़ेशन के बारे में बात कर रहा है) एक मिथ्या नाम है लेकिन "रिफ्लेक्टर कोड को तंग युग्मन ढीला करने के लिए" के आंदोलन के बारे में। कोड के हर स्तर पर। मैं अभी हाल ही में Zend Con से आया था, जहां इस शैली की संहिता सम्मेलन के मुख्य बिंदुओं और केंद्र बिंदुओं में से एक रही है। व्यू से तार्किक तर्क, मॉडल से दृश्य, डेटाबेस से मॉडल, और यदि आप कर सकते हैं, तो डेटाबेस से डेटा को कम कर दें। निर्भरता-सब कुछ इंजेक्ट करें, जिसका अर्थ कभी-कभी केवल वायरिंग कोड (फ़ंक्शन, कक्षाएं, बॉयलरप्लेट) जोड़ना होता है जो कुछ भी नहीं करता है, लेकिन ज्यादातर मामलों में आसानी से कोड आकार को दोगुना करने के लिए एक सीवन / हुक बिंदु के रूप में कार्य करता है।

अद्यतन 2: "अधिक फ़ाइलों में कोड को अलग करता है" प्रदर्शन को काफी प्रभावित करता है (कंप्यूटिंग के सभी स्तरों पर)

compartmentalize your code into multiple filesआज के कंप्यूटिंग (प्रदर्शन, डिस्क उपयोग, मेमोरी प्रबंधन, सीपीयू प्रसंस्करण कार्यों) के प्रभाव का दर्शन कैसे होता है ?

मैं इस बारे में बात कर रहा हूँ

इससे पहले कि ...

काल्पनिक रूप से अभी तक काफी वास्तविक नहीं है, इसलिए आप अतीत में एक फाइल के एक मोनो-ब्लॉक को आसानी से लिख सकते हैं, जिसमें मॉडल और व्यू और कंट्रोलर स्पेगेटी या स्पैगेटी-कोडेड नहीं है, लेकिन यह सब कुछ एक बार पहले ही लोड हो जाने पर चलता है। C कोड का उपयोग करते हुए अतीत में कुछ बेंचमार्क करने से मुझे पता चला कि यह एक 900Mb फाइल को मेमोरी में लोड करने और इसे बड़ी मात्रा में प्रोसेस करने की तुलना में बहुत छोटा फाइलों के एक समूह को लोड करने और एक छोटे से शांति-भोजन में प्रोसेस करने के लिए यह बहुत तेज़ है। अंत में एक ही काम कर रहे विखंडू।

.. और अब*

आज मैं अपने आप को एक ऐसे कोड को देखता हूं, जो एक लेज़र दिखाता है, जिसमें विशेषताएं हैं .. यदि कोई आइटम "ऑर्डर" है, तो HTML ऑर्डर दिखाएं। यदि एक पंक्ति वस्तु को कॉपी किया जा सकता है, तो एचटीएमएल ब्लॉक को प्रिंट करें जो एक आइकन प्रदर्शित करता है और एचटीएमएल पैरामीटर इसके पीछे आपको प्रतिलिपि बनाने की अनुमति देता है। यदि आइटम को ऊपर या नीचे ले जाया जा सकता है, तो उपयुक्त HTML तीर प्रदर्शित करें। आदि मैं Zend फ्रेमवर्क के माध्यम से कर सकते हैंpartial()कॉल, जिसका अनिवार्य रूप से अर्थ है "एक फ़ंक्शन को कॉल करें जो आपके मापदंडों को लेता है और उन्हें एक अलग HTML फ़ाइल में सम्मिलित करता है जिसे वह कॉल भी करता है"। इस बात पर निर्भर करता है कि मैं कितना विस्तृत होना चाहता हूं, मैं बही के सबसे छोटे हिस्सों के लिए अलग-अलग HTML फ़ंक्शन बना सकता हूं। तीर के लिए एक, नीचे तीर, "मैं इस आइटम को कॉपी कर सकता हूं" के लिए एक, आदि वेबपेज के एक छोटे से हिस्से को प्रदर्शित करने के लिए आसानी से कई फाइलें बना रहा है। मेरे कोड और दृश्यों के पीछे Zend फ्रेमवर्क कोड लेते हुए, सिस्टम / स्टैक शायद 20-30 अलग-अलग फ़ाइलों के करीब कॉल करता है।

क्या?

मुझे पहलुओं पर दिलचस्पी है, मशीन पर पहनने और आंसू जो कई छोटे अलग-अलग फाइलों में कोड कंपार्टमेंटिंग करके बनाए जाते हैं।

उदाहरण के लिए, अधिक फ़ाइलों को लोड करने का अर्थ है उन्हें फ़ाइल सिस्टम के विभिन्न स्थानों में स्थित होना और भौतिक HDD के विभिन्न स्थानों में, जिसका अर्थ है कि अधिक HDD की तलाश और समय पढ़ना।

सीपीयू के लिए इसका अर्थ शायद विभिन्न रजिस्टरों को स्विच और लोड करना अधिक संदर्भ है।

इस उप-ब्लॉक में (# 2 अपडेट करें) मैं अधिक सख्ती से दिलचस्पी रखता हूं कि एक ही फाइल में एक ही कार्य को करने के लिए कई फाइलों का उपयोग कैसे किया जाए, जो सिस्टम प्रदर्शन को प्रभावित करता है।

सरल HTML बनाम Zend Form API का उपयोग करना

मैंने नवीनतम और महानतम आधुनिक OO प्रथाओं के साथ Zend Form API का उपयोग किया, ताकि POSTडोमेन ऑब्जेक्ट्स में रूपांतरण के साथ HTML फॉर्म का निर्माण किया जा सके।

इसे बनाने में मुझे 35 फाइलें लगीं।

35 files = 
    = 10 fieldsets x {programmatic fieldset + fieldset manager + view template} 
    + a few supporting files

जिनमें से सभी को कुछ सरल एचटीएमएल + पीएचपी + जेएस + सीएसएस फाइलों के साथ बदला जा सकता है, शायद कुल 4 लाइट-वेट फाइलें।

क्या यह बेहतर है? क्या यह इसके योग्य है? ... 35 फाइलों को लोड करने की कल्पना करें + कई Zend Zramework पुस्तकालय फाइलें जो उन्हें काम करती हैं, बनाम 4 सरल फाइलें।


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

7
@ दान: क्या आप इसे 1, 5 और 10 साल के रखरखाव के बाद कोड बेंचमार्क करने के लिए कैलेंडर में डाल सकते हैं। अगर मुझे याद है कि मैं परिणामों के लिए वापस जाँच करूँगा :)
23:49

1
हाँ, यह असली किकर है। मुझे लगता है कि हम सभी कम लुकअप और फंक्शन कॉल करने से सहमत हैं। हालाँकि, मैं एक ऐसे मामले की कल्पना नहीं कर सकता हूँ जहाँ नई टीम के सदस्यों को बनाए रखने और आसानी से प्रशिक्षित करने जैसी चीज़ों को प्राथमिकता दी गई थी।
डैन सबिन

2
स्पष्ट करने के लिए आपको अपनी परियोजना के लिए विशिष्ट गति की आवश्यकता है। या क्या आप चाहते हैं कि आपका कोड "तेज़ी से आगे बढ़ें!" अगर यह बाद की बात है, तो मैं इसके बारे में चिंता नहीं करूँगा, कोड जो काफी तेज़ है लेकिन बनाए रखने में आसान कोड की तुलना में कहीं अधिक बेहतर है जो तेजी से पर्याप्त है लेकिन गड़बड़ है।
कॉर्मैक मुल्हल

4
प्रदर्शन कारणों से फ़ंक्शन कॉल से बचने का विचार बिल्कुल उस तरह का बशीश पागल सोच है, जो कि दिक्जस्त्र ने प्री-मैच्योर ऑप्टिमाइज़ेशन के बारे में अपने प्रसिद्ध उद्धरण में सुना था। सच में, मैं नहीं कर सकता
RibaldEddie

जवाबों:


10

मेरा सवाल यह है: जब यह कॉल मशीन कोड, 1s और 0s, असेंबली निर्देशों के लिए नीचे आता है, तो क्या मुझे इस बात से चिंतित होना चाहिए कि छोटे-से-छोटे कार्यों की विविधता वाला मेरा वर्ग-अलग कोड बहुत अधिक अतिरिक्त ओवरहेड उत्पन्न करता है?

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

उदाहरण के लिए, मैंने एक ऐसे स्थान पर काम किया, जिसने मुझे 1 विधि के साथ एक वेब सेवा के लिए एक संदर्भ परियोजना दिखाई। परियोजना में 32 .cs फाइलें शामिल थीं - एकल वेब सेवा के लिए! मुझे लगा कि इस तरह से बहुत अधिक जटिलता थी, भले ही प्रत्येक भाग छोटा था और आसानी से खुद को समझा जाता था, जब यह समग्र प्रणाली का वर्णन करने के लिए आया था, मैंने जल्दी से खुद को कॉल के माध्यम से पता लगाने के लिए पाया कि यह क्या कर रहा था (वहां जैसा कि आप उम्मीद करेंगे, इसमें बहुत सारे सार शामिल थे)। मेरी प्रतिस्थापन webservice 4 .cs फाइलें थी।

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

यह कहीं कहा गया था (टीबीडी) कि सभी कोड का 70% तक एएसएम के एमओवी निर्देश से बना है - उचित चर के साथ सीपीयू रजिस्टर लोड हो रहा है, वास्तविक गणना नहीं की जा रही है।

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

इसलिए मेरी सलाह है: या तो चरम के बीच एक समझदार मध्य मैदान खोजें जो आपके कोड को अन्य मनुष्यों के लिए अच्छा लगता है, और यह देखने के लिए सिस्टम का परीक्षण करता है कि क्या यह अच्छा प्रदर्शन करता है। यह सुनिश्चित करने के लिए OS सुविधाओं का उपयोग करें कि आप CPU, मेमोरी, डिस्क और नेटवर्क IO से अपेक्षा करें।


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

1
व्यक्तिगत रूप से, मुझे लगता है कि अधिक "" आधुनिक "" कोड प्रोफाइल के लिए कुछ हद तक आसान है ... मुझे लगता है कि कोड के अधिक रखरखाव योग्य टुकड़ा है, यह प्रोफाइल के लिए भी आसान है, लेकिन एक सीमा है, जहां चीजों को छोटे टुकड़ों में तोड़ना उन्हें आसान बनाता है। कम बनाए रखने योग्य ...
AK_

25

अत्यधिक देखभाल के बिना, इन चिंताओं के रूप में माइक्रो अनुकूलन, अचूक कोड की ओर जाता है।

शुरू में यह एक अच्छा विचार लगता है, प्रोफाइलर आपको बताता है कि कोड तेज है और V & V / Test / QA यहां तक ​​कि काम भी कहता है। जल्द ही कीड़े पाए जाते हैं, आवश्यकताएं बदल जाती हैं और संवर्द्धन जो कभी नहीं माना जाता था, के लिए कहा जाता है।

एक परियोजना कोड के जीवन में गिरावट और कम कुशल हो जाता है। बनाए रखने योग्य कोड अपने अचूक समकक्ष की तुलना में अधिक कुशल हो जाएगा क्योंकि यह धीमी गति से कम हो जाएगा। कारण कोड एंट्रॉपी है क्योंकि यह बदल जाता है -

अचूक कोड में जल्दी से अधिक मृत कोड, निरर्थक पथ और दोहराव होता है। इससे कोड में गिरावट के चक्र का निर्माण होता है, जिसमें इसका प्रदर्शन भी शामिल है। लंबे समय से पहले, डेवलपर्स को कम विश्वास है कि वे जो बदलाव कर रहे हैं वे सही हैं। यह उन्हें धीमा कर देता है, सतर्क बनाता है और आम तौर पर और भी अधिक जटिल होता है क्योंकि वे केवल उसी विस्तार को संबोधित करते हैं जिसे वे देख सकते हैं

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

तो अंत में यह जीवन चक्र प्रबंधन के लिए नीचे आता है और यह "यह तेज है इसलिए यह हमेशा तेज होगा।"

इन सबसे ऊपर, धीमे सही कोड तेजी से गलत कोड की तुलना में असीम रूप से तेज है।


Thankx। जहाँ मैं जा रहा था, इस दिशा में थोड़ा ड्राइव करने के लिए, मैं माइक्रो-ऑप्टिमाइज़ेशन के बारे में बात नहीं कर रहा हूँ, लेकिन छोटे कोड लिखने की दिशा में एक वैश्विक कदम, अधिक निर्भरता इंजेक्शन को शामिल करना और इसलिए अधिक बाहर की कार्यक्षमता के टुकड़े, और सामान्य रूप से कोड के अधिक "चलती भागों"। काम करने के लिए उन सभी को एक साथ जोड़ने की जरूरत है। मुझे लगता है कि यह हार्डवेयर स्तर पर अधिक लिंकेज / कनेक्टर / चर-गुजर / MOV / PUSH / POP / CALL / JMP फुल पैदा करता है। मुझे कोड पठनीयता की ओर शिफ्ट में एक मूल्य भी दिखाई देता है, हालांकि "कफ" के लिए हार्डवेयर-स्तरीय कंप्यूटिंग चक्रों की बलि देने की कीमत पर।
डेनिस

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

17

मेरी समझ में, जैसा कि आप इनलाइन के साथ इंगित करते हैं, सी ++ जैसे कोड के निचले स्तर के रूपों पर यह एक फर्क कर सकता है, लेकिन मैं कहता हूं कि कैन हल्के से।

वेबसाइट इसे तैयार करती है - कोई आसान जवाब नहीं है । यह सिस्टम पर निर्भर करता है, यह इस बात पर निर्भर करता है कि आपका आवेदन क्या कर रहा है, यह भाषा पर निर्भर करता है, यह कंपाइलर और अनुकूलन पर निर्भर करता है।

उदाहरण के लिए C ++, इनलाइन प्रदर्शन बढ़ा सकता है। कई बार यह कुछ भी नहीं कर सकता है, या संभवतः प्रदर्शन को कम कर सकता है, लेकिन मैंने व्यक्तिगत रूप से कभी भी सामना नहीं किया है, हालांकि कहानियों के बारे में सुना है। इनलाइन को कंपाइलर को ऑप्टिमाइज़ करने के सुझाव से ज्यादा कुछ नहीं है, जिसे नज़रअंदाज़ किया जा सकता है।

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

लेकिन निचले स्तर के कार्यक्रमों में जहाँ प्रोग्रामर C ++ जैसी किसी चीज़ के साथ बहुत सारे मशीन कोड का काम कर रहा हो सकता है, ओवरहीर्ड से सारा फर्क पड़ सकता है। खेल एक अच्छा उदाहरण है जहां सीपीयू पाइपलाइनिंग महत्वपूर्ण है, विशेष रूप से कंसोल पर, और इनलाइन की तरह कुछ यहां और वहां थोड़ा जोड़ सकते हैं।

विशेष रूप से इनलाइन पर एक अच्छा पढ़ा: http://www.gotw.ca/gotw/033.htm


मेरे प्रश्न के दृष्टिकोण से आते हुए, मैं प्रति seh को अंदर लेने पर केंद्रित नहीं हूं, लेकिन सीपीयू, बस 'और "/ O की समय प्रक्रिया को कोड के विभिन्न टुकड़ों को जोड़ने वाली" कोडित वायरिंग "पर केंद्रित है। मुझे आश्चर्य है कि अगर कुछ बिंदु है जहां वायरिंग कोड का 50% या अधिक है और वास्तविक कोड का 50% आप चलाना चाहते थे। मुझे लगता है कि सबसे कठिन कोड में भी बहुत अधिक फुल हो सकता है, और यह जीवन का एक तथ्य है। बिट्स और बाइट्स स्तर पर चलने वाले वास्तविक कोड में से अधिकांश लॉजिस्टिक्स है - मूल्यों को एक स्थान से दूसरे स्थान तक ले जाना, एक स्थान या किसी अन्य पर कूदना, और केवल कभी-कभी जोड़ना।
डेनिस

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

3
@ डेनिस - विचार करने वाली एक बात यह है कि एक ओओ भाषा में, प्रोग्रामर (a + b) क्या लिखता है और क्या कोड उत्पन्न होता है (दो रजिस्टरों का एक सरल जोड़? मेमोरी से पहली बार? कास्टिंग) के बीच बहुत कम सहसंबंध हो सकता है? तब फ़ंक्शन किसी ऑब्जेक्ट के ऑपरेटर +?) में कॉल करता है। इसलिए प्रोग्रामर के स्तर पर 'छोटे कार्य' मशीन कोड में दिए गए कुछ भी हो सकते हैं।
माइकल कोहेन

2
@ डेनिस कह सकता है कि विंडोज के लिए ASM कोड (सीधे, संकलित नहीं) लिखना "mov, mov, invoke, mov, mov, invoke" की तर्ज पर जाता है। आह्वान के साथ एक मैक्रो होने के नाते जो पुश / पॉप द्वारा लिपटा हुआ कॉल करता है ... कभी-कभी आप अपने स्वयं के कोड में फ़ंक्शन कॉल करेंगे, लेकिन यह सभी OS कॉल द्वारा बौना है।
ब्रायन नोब्लुक

12

यह "पुराने" या "खराब" कोड प्रथाओं की तुलना में एक बदलाव है जहां आपके पास 2500 लाइनें फैले हुए तरीके हैं, और बड़े वर्ग सब कुछ कर रहे हैं।

मुझे नहीं लगता कि किसी ने कभी सोचा कि यह एक अच्छा अभ्यास है। और मुझे संदेह है कि लोगों ने प्रदर्शन के कारणों से ऐसा किया।

मुझे लगता है कि डोनाल्ड नथ का प्रसिद्ध उद्धरण यहां बहुत प्रासंगिक है:

हमें छोटी क्षमताओं के बारे में भूलना चाहिए, समय के 97% के बारे में कहना चाहिए: समय से पहले अनुकूलन सभी बुराई की जड़ है।

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


11

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

मेरे अनुभव में, यहाँ वही है जो मंदी की ओर जाता है, और वे छोटे नहीं हैं। वे परिमाण के आदेश हैं:

  • यह धारणा कि कोड की कोई भी रेखा लगभग किसी भी अन्य की तरह अधिक समय लेती है। उदाहरण के लिए cout << endlबनाम a = b + c। पूर्ववर्ती उत्तरार्द्ध की तुलना में हजारों गुना अधिक लंबा होता है। Stackexchange के प्रपत्र के बहुत सारे प्रश्न हैं "मैंने इस कोड के अनुकूलन के विभिन्न तरीकों की कोशिश की है, लेकिन यह कोई फर्क नहीं पड़ता है, क्यों नहीं?" जब इसके बीच में एक बड़ा-पुराना फ़ंक्शन कॉल होता है।

  • यह धारणा कि कोई भी फ़ंक्शन या विधि कॉल, एक बार लिखी गई, निश्चित रूप से आवश्यक है। कार्यों और विधियों को कॉल करना आसान है, और कॉलिंग आमतौर पर बहुत कुशल है। समस्या यह है कि वे क्रेडिट कार्ड की तरह हैं। वे आपको वास्तव में आप जितना चाहते हैं उससे अधिक खर्च करने के लिए लुभाते हैं, और वे जो आप खर्च करते हैं उसे छिपाने के लिए करते हैं। उसके शीर्ष पर, बड़े सॉफ़्टवेयर में एब्स्ट्रक्शन की परतों पर परतें होती हैं, इसलिए भले ही प्रत्येक परत पर केवल 15% अपशिष्ट हो, 5 परतों पर जो कि 2 के मंदी कारक को समेटती है। इसका उत्तर कार्यक्षमता निकालना या लिखना नहीं है बड़े कार्य, यह इस समस्या के लिए अपने आप को गार्ड करने के लिए अनुशासित है और इसके लिए तैयार और सक्षम होना चाहिए

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

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

... जब मैं अधिक के बारे में सोचता हूं तो मैं इसे जोड़ दूंगा।


8

छोटा जवाब हां है"। और, आम तौर पर, कोड थोड़ा धीमा होगा।

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

परिशिष्ट: सामान्य रूप से, छोटे, बेहतर संरचित कोड को मल्टी-थ्रेडिंग के लिए अधिक उत्तरदायी होना चाहिए, आपका सबसे अच्छा तरीका है कि आप अधिकतम स्पीडअप प्राप्त करें।


1
मैं यह नहीं देखता कि बेहतर संरचित कोड के Doubleलिए doubleएस से स्विचिंग की आवश्यकता क्यों होगी ।
12

वाह, एक downvote? मूल ग्राहक कोड Double.NaNs के साथ व्यवहार नहीं करता था, लेकिन रिक्त मानों का प्रतिनिधित्व करने के लिए नल की जाँच कर रहा था। पुनर्गठन के बाद, हम इसे (एन्कैप्सुलेशन के माध्यम से) विभिन्न एल्गोरिदम परिणामों के गेटर्स के साथ संभाल सकते हैं। ज़रूर, हम ग्राहक कोड को फिर से लिख सकते हैं, लेकिन यह आसान था।
user949300

रिकॉर्ड के लिए, मैं ऐसा नहीं था जिसने इस उत्तर को अस्वीकार कर दिया था।
12

7

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

जैसा कि @ user949300 ने उल्लेख किया है , ऐसे क्षेत्रों को स्पॉट करना आसान है जो इस तरह के दृष्टिकोण के साथ एल्गोरिदम या वास्तुशिल्प रूप से बेहतर हो सकते हैं; सुधार के उन आम तौर पर कहीं अधिक लाभकारी और न होने की अपेक्षा प्रभावी रहे हैं संभव OO या समारोह-बुला भूमि के ऊपर (जो पहले से ही सिर्फ एक आवाज है, मैं शर्त)।


मैं यह भी कल्पना करता हूं कि हार्डवेयर पर वास्तव में चलने से पहले ASM के लिए अच्छे अनुकूलन किए जा सकते हैं।

जब भी कोई चीज मेरे दिमाग को पार करती है, मुझे याद है कि कंपाइलर पर काम करने वाले सबसे चतुर लोगों द्वारा बिताए गए दशक शायद जीसीसी जैसे उपकरण बना रहे हैं जो मशीन कोड बनाने में मुझसे बेहतर हैं। जब तक आप किसी प्रकार के माइक्रोकंट्रोलर से संबंधित सामान पर काम नहीं कर रहे हैं, मेरा सुझाव है कि आप इसके बारे में चिंता न करें।

मैं यह मान रहा हूं कि एक कोड में अधिक से अधिक कार्यों और अधिक से अधिक वस्तुओं और वर्गों को जोड़ने से अधिक से अधिक पैरामीटर छोटे कोड टुकड़ों के बीच गुजरेंगे।

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


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

PS: क्रोकफोर्ड की ये 2 बातें मेरे दिमाग में कौंध गईं और मुझे लगता है कि वे कुछ हद तक संबंधित हैं। पहले एक सुपर संक्षिप्त सीएस इतिहास है (जो किसी भी सटीक विज्ञान के साथ जानना हमेशा अच्छा होता है); और दूसरा यह है कि हम अच्छी चीजों को क्यों अस्वीकार करते हैं।


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

4

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


1
मैं सहमत हूं, लेकिन मोबाइल डिवाइस इतने लोकप्रिय हो रहे हैं कि मुझे लगता है कि वे एक बड़े अपवाद हैं। हालाँकि प्रसंस्करण शक्ति बढ़ रही है, आप एक iPhone ऐप नहीं बना सकते हैं और उम्मीद कर सकते हैं कि जैसे आप वेबसर्वर पर मेमोरी जोड़ सकते हैं।
जेएफओ

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

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

कच्चे सीपीयू बेंचमार्क की तुलना में प्रदर्शन अधिक है। मेरा एंड्रॉइड फोन ठीक काम करता है, सिवाय जब एवी एक अपडेट को स्कैन कर रहा है और तब यह मुझे पसंद करने की तुलना में लंबे समय तक लटका हुआ प्रतीत होता है, और इसका क्वाड-कोर 2 जीबी रैम मॉडल है! आज बैंडविड्थ (चाहे नेटवर्क या मेमोरी) शायद मुख्य अड़चन है। आपका सुपरफास्ट सीपीयू शायद 99% समय में अपने अंगूठे को दोहरा रहा है और समग्र अनुभव अभी भी खराब है।
gbjbaanb

4

खैर 20+ साल पहले, जो मैं अनुमान लगा रहा हूं कि आप नए नहीं कह रहे हैं और "पुराने या बुरे" नहीं हैं, नियम एक मुद्रित पृष्ठ पर फिट होने के लिए कार्यों को छोटा रखने के लिए था। हमारे पास डॉट मैट्रिक्स प्रिंटर थे, इसलिए लाइनों की संख्या कुछ हद तक प्रति पृष्ठ लाइनों की संख्या के लिए आम तौर पर केवल एक या दो विकल्प तय की गई थी ... निश्चित रूप से 2500 से कम लाइनें।

आप समस्या के कई पक्षों, रखरखाव, प्रदर्शन, परीक्षणशीलता, पठनीयता के बारे में पूछ रहे हैं। जितना अधिक आप प्रदर्शन को कम बनाए रखते हैं और पठनीय होते जाएंगे उतना ही कोड बन जाएगा, इसलिए आपको अपना आराम स्तर ढूंढना होगा जो प्रत्येक व्यक्तिगत प्रोग्रामर के लिए अलग-अलग हो सकता है और होगा।

जहां तक ​​संकलक द्वारा निर्मित कोड (मशीन कोड यदि आप होगा), तो बड़े फ़ंक्शन ढेर में रजिस्टरों में मध्यवर्ती मूल्यों को फैलाने की आवश्यकता के लिए अधिक अवसर है। जब स्टैक फ्रेम का उपयोग किया जाता है तो स्टैक की खपत बड़ी मात्रा में होती है। छोटे कार्य रजिस्टरों में अधिक रहने और स्टैक पर कम निर्भरता के लिए अधिक अवसर प्रदान करते हैं। स्वाभाविक रूप से प्रति कार्य स्टैक की छोटी मात्रा की आवश्यकता होती है। स्टैक फ्रेम में प्रदर्शन के लिए पेशेवरों और विपक्ष हैं। अधिक छोटे फ़ंक्शन का अर्थ है अधिक फ़ंक्शन सेटअप और क्लीनअप। बेशक यह इस बात पर भी निर्भर करता है कि आप कैसे संकलित करते हैं, आप संकलक को क्या अवसर देते हैं। एक 2500 लाइन फ़ंक्शन के बजाय आपके पास 250 10 लाइन फ़ंक्शन हो सकते हैं, एक 2500 लाइन फ़ंक्शन कंपाइलर प्राप्त करने जा रहा है यदि यह पूरी चीज़ को अनुकूलित करने का विकल्प चुन सकता है। लेकिन अगर आप उन 250 10 लाइन फ़ंक्शंस को लेते हैं और उन्हें 2, 3, 4, 250 अलग-अलग फ़ाइलों में फैलाते हैं, तो प्रत्येक फ़ाइल को अलग-अलग संकलित करें, तो कंपाइलर लगभग उतने मृत कोड का अनुकूलन करने में सक्षम हो सकता है जितना कि यह हो सकता है। नीचे की रेखा यहां दोनों के लिए पेशेवरों और विपक्ष हैं और इस पर एक सामान्य नियम रखना संभव नहीं है या यह सबसे अच्छा तरीका है।

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

यूनिक्स तरीका मेरा शब्द, अच्छी तरह से पॉलिश लेगो ब्लॉक का उपयोग करना है। टेपों का उपयोग बंद करने के बाद आप कई वर्षों तक टेप फ़ंक्शन का उपयोग क्यों करेंगे? क्योंकि बूँद ने अपना काम बहुत अच्छा किया और पीछे की तरफ हम टेप इंटरफ़ेस को एक फ़ाइल इंटरफ़ेस से बदल सकते हैं और कार्यक्रम के मांस का लाभ उठा सकते हैं। क्यों cdrom जलन सॉफ्टवेयर को फिर से लिखें क्योंकि scsi ide (तब बाद में वापस आने के लिए) द्वारा प्रतिस्थापित प्रमुख इंटरफ़ेस के रूप में चला गया। फिर से पॉलिश किए गए सब ब्लॉक्स का एडवांटेज लें और एक छोर को एक नए इंटरफ़ेस ब्लॉक से बदलें (यह भी समझ लें कि हार्डवेयर डिज़ाइनर ने हार्डवेयर डिज़ाइन पर इंटरफ़ेस ब्लॉक को टैकल किया है। कुछ मामलों में एक स्कैसी ड्राइव में इंटरफ़ेस को स्केडी करने के लिए एक आइडी है। इसे छोटा करने के लिए। , एक अच्छी तरह से परिभाषित उद्देश्य और अच्छी तरह से परिभाषित आदानों और आउटपुट के साथ उचित आकार के पॉलिश लेगो ब्लॉकों का निर्माण करें। आप उन लेगो ब्लॉकों के चारों ओर परीक्षण लपेट सकते हैं और फिर उसी ब्लॉक को ले सकते हैं और उपयोगकर्ता इंटरफ़ेस और ऑपरेटिंग सिस्टम इंटरफेस को उसी ब्लॉक और ब्लॉक के चारों ओर लपेट सकते हैं, सिद्धांत रूप में अच्छी तरह से परीक्षण किया जा रहा है और अच्छी तरह से समझा नहीं जाना चाहिए, अतिरिक्त नए ब्लॉक जोड़े गए। प्रत्येक छोर पर। जब तक आपके सभी ब्लॉक इंटरफेस अच्छी तरह से डिज़ाइन किए गए हैं और कार्यक्षमता अच्छी तरह से समझ गई है कि आप किसी भी गोंद के साथ कम से कम एक महान कई चीजों का निर्माण कर सकते हैं। नीले और लाल और काले और पीले लेगो ब्लॉक के साथ ज्ञात आकार और आकार की तरह ही आप कई बेहतरीन चीजें बना सकते हैं। जब तक आपके सभी ब्लॉक इंटरफेस अच्छी तरह से डिज़ाइन किए गए हैं और कार्यक्षमता अच्छी तरह से समझ गई है कि आप किसी भी गोंद के साथ कम से कम एक महान कई चीजों का निर्माण कर सकते हैं। नीले और लाल और काले और पीले लेगो ब्लॉक के साथ ज्ञात आकार और आकार की तरह ही आप कई बेहतरीन चीजें बना सकते हैं। जब तक आपके सभी ब्लॉक इंटरफेस अच्छी तरह से डिज़ाइन किए गए हैं और कार्यक्षमता अच्छी तरह से समझ गई है कि आप किसी भी गोंद के साथ कम से कम एक महान कई चीजों का निर्माण कर सकते हैं। नीले और लाल और काले और पीले लेगो ब्लॉक के साथ ज्ञात आकार और आकार की तरह ही आप कई बेहतरीन चीजें बना सकते हैं।

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


"तो आपको अपना आराम स्तर ढूंढना होगा जो प्रत्येक व्यक्तिगत प्रोग्रामर के लिए अलग-अलग हो सकता है" मुझे लगता है कि अनुकूलन के स्तर को प्रत्येक कोड के प्रदर्शन आवश्यकताओं के अनुसार तय किया जाना चाहिए, न कि प्रत्येक प्रोग्रामर को जो पसंद है।
12

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

2

निर्भर करता है कि आपका कंपाइलर कितना स्मार्ट है। आमतौर पर, ऑप्टिमाइज़र को बाहर करने की कोशिश करना एक बुरा विचार है और वास्तव में अनुकूलन के अवसरों के संकलक को लूट सकता है। शुरुआत के लिए, आपके पास संभवतः कोई सुराग नहीं है कि यह क्या कर सकता है और आप जो भी करते हैं उसमें से अधिकांश वास्तव में कितना अच्छा होता है, यह भी प्रभावित करता है।

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

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


0

[कंप्यूटर-टाइम एलिमेंट]

क्या लोसर युग्मन और छोटे क्रियाकलापों की ओर पुनरावृत्ति करने से कोड की गति प्रभावित होती है?

हाँ यह करता है। लेकिन यह दुभाषियों, संकलक और JIT- संकलक पर निर्भर है कि वे इस "सीम / वायरिंग" कोड को हटा दें, और कुछ इसे दूसरों की तुलना में बेहतर करते हैं, लेकिन कुछ नहीं करते हैं।

एकाधिक-फ़ाइल चिंता I / O ओवरहेड में जुड़ जाती है, जिससे गति काफी कम हो जाती है और साथ ही (कंप्यूटर-समय में)।

[मानव-गति तत्व]

(और मुझे परवाह करनी चाहिए?)

नहीं, आपको परवाह नहीं करनी चाहिए कंप्यूटर और सर्किट इन दिनों बहुत तेज हैं, और अन्य कारक जैसे नेटवर्क विलंबता, डेटाबेस I / O, और कैशिंग को संभालते हैं।

तो 2x - 4x धीमा देशी कोड निष्पादन में ही अक्सर उन अन्य कारकों द्वारा डूब जाएगा।

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


0

उत्तर (मामले में आप चूक गए)

हां, आपको परवाह करनी चाहिए, लेकिन परवाह करें कि आप कोड कैसे लिखते हैं, और प्रदर्शन के बारे में नहीं।

संक्षेप में

प्रदर्शन की परवाह मत करो

प्रश्न के संदर्भ में, होशियार संकलक और व्याख्याकार पहले से ही ध्यान रखते हैं

मेंटेनेंस कोड लिखने की परवाह करें

कोड जहां रखरखाव की लागत उचित मानव समझ के स्तर पर है। यदि आप हर एक को समझते हैं, तो भी 1000 छोटे-छोटे काम नहीं करते, जो कोड को समझ से बाहर कर देते हैं और 1 ईश्वर ऑब्जेक्ट फ़ंक्शन को नहीं लिखते हैं जो समझने के लिए बहुत बड़ा है, लेकिन 10 अच्छी तरह से इंजीनियर कार्यों को लिखें जो मानव के लिए समझ में आते हैं, और हैं संभालने में आसान।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.