स्मृति प्रबंधन के संबंध में एंट्री लेवल इंजीनियर प्रश्न


9

प्रवेश स्तर के सॉफ्टवेयर डेवलपर के रूप में अपनी स्थिति शुरू करने में मुझे कुछ महीने हो गए हैं। अब जब मैं कुछ सीखने की अवस्थाएँ पार कर रहा हूँ (जैसे भाषा, शब्दजाल, VB और C # का वाक्यविन्यास) मैं अधिक गूढ़ विषयों पर ध्यान देना शुरू कर रहा हूँ, जैसा कि बेहतर सॉफ्टवेयर लिखने के लिए।

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

यहाँ कोड (VB में) था और उसके बाद प्रश्न था।

नोट: फ़ंक्शन GenerateAlert () एक पूर्णांक देता है।

Dim alertID as Integer = GenerateAlert()
_errorDictionary.Add(argErrorID, NewErrorInfo(Now(), alertID))    

बनाम ...

 _errorDictionary.Add(argErrorID, New ErrorInfo(Now(), GenerateAlert()))

मैंने मूल रूप से उत्तरार्द्ध लिखा था और इसे "मंद चेतावनी" के साथ फिर से लिखा था ताकि किसी और को पढ़ने में आसानी हो। लेकिन यहाँ मेरी चिंता और सवाल था:

क्या इसे डिम अलर्ट के साथ लिखना चाहिए, यह वास्तव में अधिक मेमोरी लेगा; परिमित लेकिन अधिक, और इस विधि को कई बार कहा जाना चाहिए कि क्या यह एक मुद्दा हो सकता है? .NET इस ऑब्जेक्ट को कैसे अलर्ट करेगा। .NET के बाहर एक को मैन्युअल रूप से उपयोग के बाद ऑब्जेक्ट का निपटान करना चाहिए (उप के अंत के पास)।

मैं यह सुनिश्चित करना चाहता हूं कि मैं एक ज्ञानी प्रोग्रामर बनूं जो केवल कचरा संग्रहण पर निर्भर न हो। क्या मैं यह सोचने पर हूँ? क्या मैं गलत चीजों पर ध्यान केंद्रित कर रहा हूं?


1
मैं आसानी से मामला बना सकता था कि वह 100% है क्योंकि पहला संस्करण अधिक पठनीय है। मैं कंपाइलर को दांव पर लगा सकता हूँ, आप इस बात का भी ध्यान रख सकते हैं कि आप किससे चिंतित हैं। यहां तक ​​कि अगर यह नहीं था, तो आप समय से पहले अनुकूलन कर रहे हैं।
ऋग्वेद

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

5
नाम बनाम अनाम पूर्णांक अधिक मेमोरी का उपयोग नहीं करेगा, खासकर जब से एक अनाम पूर्णांक केवल एक नामित पूर्णांक है जिसे आपने नाम नहीं दिया था (संकलक को अभी भी नाम देना है)। अधिकांशतः, नामित पूर्णांक में एक अलग क्षेत्र होगा इसलिए यह अधिक समय तक जीवित रह सकता है। अनाम पूर्णांक केवल तभी तक जीवित रहेगा जब तक विधि को इसकी आवश्यकता होगी, नाम तब तक रहेगा जब तक कि उसके माता-पिता को इसकी आवश्यकता होगी।
जोएल एथरटन

आइए देखें ... यदि इंटेगर एक वर्ग है, तो इसे ढेर पर आवंटित किया जाएगा। स्थानीय चर (स्टैक पर सबसे अधिक संभावना है) इसके लिए एक संदर्भ रखेगा। संदर्भ ऑब्जेक्ट त्रुटि छाया में पास किया जाएगा। यदि रनटाइम रेफरेंस काउंटिंग (या ऐसा) कर रहा है, तो जब कोई और संदर्भ नहीं हैं, तो यह (ऑब्जेक्ट) ढेर से निपटा जाएगा। स्टैच पर कुछ भी स्वचालित रूप से "एक्सक्लूसिव" हो जाता है, जब एक बार विधि निकल जाती है। यदि यह एक आदिम है, तो यह (सबसे अधिक संभावना) स्टैक पर समाप्त होगा।
पॉल

आपका सहकर्मी सही था: आपके प्रश्न द्वारा उठाया गया मुद्दा अनुकूलन के बारे में नहीं होना चाहिए, बल्कि पठनीयता के बारे में होना चाहिए ।
जाइलम

जवाबों:


25

"समयपूर्व अनुकूलन प्रोग्रामिंग में सभी बुराई (या कम से कम अधिकांश) की जड़ है।" - डोनाल्ड नथ

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

क्या यह प्रदर्शन और अनुकूलन के इन विषयों में खुदाई के लायक है? बिल्कुल, लेकिन आपकी कंपनी के डॉलर पर नहीं अगर यह अनावश्यक है।


1
किसके और कितने डॉलर होने चाहिए? आपका नियोक्ता आपके कौशल में वृद्धि से लाभ उठाता है, न कि आप जितना करते हैं।
मार्सिन

विषय जो सीधे आपके वर्तमान कार्य में योगदान नहीं करते हैं? आपको अपने समय पर इन चीजों का पीछा करना चाहिए। यदि मैं बैठ गया और दिन के पाठ्यक्रम पर अपनी जिज्ञासा को बढ़ाने वाले प्रत्येक CompSci आइटम पर शोध किया, तो मुझे कुछ भी नहीं मिला। यही मेरी शाम है।
क्रिस्टोफर बर्मन

2
अजीब। हम में से कुछ का व्यक्तिगत जीवन है, और जैसा कि मैं कहता हूं, नियोक्ता को मुख्य रूप से अनुसंधान से लाभ होता है। कुंजी वास्तव में उस पर पूरे दिन खर्च नहीं करना है।
मार्सिन

6
आपके लिए अच्छा हैं। हालांकि यह वास्तव में इसे एक सार्वभौमिक नियम नहीं बनाता है। इसके अलावा, यदि आप अपने कर्मचारियों को काम पर सीखने से हतोत्साहित करते हैं, तो आपने जो कुछ किया है, वह उन्हें सीखने से हतोत्साहित करता है, और उन्हें एक और नियोक्ता खोजने के लिए प्रोत्साहित किया जो वास्तव में कर्मचारियों के विकास के लिए भुगतान करता है।
मार्सिन

2
मैं उपरोक्त टिप्पणियों में दिए गए विचारों को समझता हूं; मैं ध्यान देना चाहूंगा कि मैंने अपने लंच ब्रेक के दौरान पूछा। :)। फिर से, यहां और पूरे स्टैक एक्सचेंज साइट पर अपने इनपुट के लिए धन्यवाद; यह अमूल्य है!
सीन होब्स

5

आपके औसत .NET प्रोग्राम के लिए, हाँ, यह बहुत ज़्यादा है। ऐसे समय हो सकते हैं, जहां आप नेट के बोल्ट और बोल्ट के नीचे उतरना चाहते हैं, जो .NET के अंदर चल रहा है, लेकिन यह अपेक्षाकृत दुर्लभ है।

मेरे द्वारा किए गए कठिन संक्रमणों में से एक 90 के दशक में क्लासिक VB बैक में C और MASM का उपयोग करने से स्विच करना था। मुझे आकार और गति के लिए सब कुछ अनुकूलित करने के लिए उपयोग किया गया था। मुझे सबसे ज्यादा इस सोच को छोड़ना पड़ा और VB को प्रभावी होने के लिए यह करने दिया।


5

जैसा कि मेरे सहकर्मी हमेशा कहते थे:

  1. इसे काम करने लायक बनाओ
  2. सभी कीड़े ठीक करें यह निर्दोष काम करता है
  3. इसे सोलिड बनाओ
  4. अनुकूलन लागू करें यदि यह धीमी गति से प्रदर्शन कर रहा है

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

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


3

क्या इसे डिम अलर्ट के साथ लिखना चाहिए

पठनीयता महत्वपूर्ण है। आपके उदाहरण में, मुझे यकीन नहीं है कि आप वास्तव में ऐसी चीजें बना रहे हैं जो अधिक पठनीय हैं। GenerateAlert () का एक अच्छा नाम है और यह बहुत अधिक शोर नहीं जोड़ रहा है। आपके समय के बेहतर उपयोग हैं।

यह वास्तव में अधिक स्मृति ले जाएगा;

मुझे संदेह है कि यह नहीं है। कंपाइलर बनाने के लिए यह अपेक्षाकृत सीधा-आगे का अनुकूलन है।

क्या इस विधि को कई बार बुलाया जाना चाहिए जिससे यह एक मुद्दा बन सके?

एक मध्यस्थ के रूप में एक स्थानीय चर का उपयोग करना कचरा कलेक्टर पर कोई प्रभाव नहीं डालता है। यदि GenerateAlert () की नई मेमोरी है, तो यह मायने रखेगा। लेकिन यह स्थानीय चर की परवाह किए बिना होगा या नहीं।

.NET इस ऑब्जेक्ट को कैसे अलर्ट करेगा।

अलर्ट एक वस्तु नहीं है। GenerateAlert () का परिणाम है। AlertID वैरिएबल है, जो कि अगर यह एक स्थानीय वैरिएबल है तो बस चीजों को ट्रैक करने के लिए विधि के साथ जुड़ा हुआ स्थान है।

.NET के बाहर एक का उपयोग करने के बाद मैन्युअल रूप से वस्तु का निपटान करना चाहिए

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

मैं यह सुनिश्चित करना चाहता हूं कि मैं एक ज्ञानी प्रोग्रामर बन जाऊं जो सिर्फ कचरा संग्रहण पर निर्भर न हो। क्या मैं यह सोचने पर हूँ? क्या मैं गलत चीजों पर ध्यान केंद्रित कर रहा हूं?

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


2

यह काम करो, इसे साफ करो, इसे ठोस बनाओ, जब तक यह काम करने की आवश्यकता है इसे तेजी से काम करें

यह चीजों का सामान्य क्रम होना चाहिए। आपकी पहली प्राथमिकता कुछ ऐसा बनाना है जो स्वीकृति परीक्षणों को पारित कर देगा जो आवश्यकताओं से हटते हैं। यह आपकी पहली प्राथमिकता है क्योंकि यह आपके ग्राहक की पहली प्राथमिकता है; विकास की समय सीमा के भीतर कार्यात्मक आवश्यकताओं को पूरा करना। अगली प्राथमिकता स्वच्छ, पठनीय कोड लिखना है, जो समझना आसान है और इस प्रकार किसी भी WTFs के बिना आपकी पोस्टरिटी द्वारा बनाए रखा जा सकता है जब यह आवश्यक हो जाता है (यह लगभग "कभी" का सवाल नहीं है, तो आप या आपके जाने के बाद किसी को जाना होगा) वापस जाएं (कुछ बदलें / ठीक करें)। तीसरी प्राथमिकता यह है कि कोड को SOLID कार्यप्रणाली (या यदि आप चाहें तो GRASP) का पालन करें, जो कोड को मॉड्यूलर, पुन: प्रयोज्य, बदली जाने योग्य विखंडू में डालता है जो फिर से रखरखाव करता है (न केवल वे समझ सकते हैं कि आपने क्या किया और क्यों किया? लेकिन वहाँ स्वच्छ लाइनें हैं जिनके साथ मैं शल्य चिकित्सा को हटा सकता हूं और कोड के टुकड़े बदल सकता हूं)। अंतिम प्राथमिकता प्रदर्शन है; यदि कोड पर्याप्त महत्वपूर्ण है कि उसे प्रदर्शन चश्मा के अनुरूप होना है, तो यह निश्चित रूप से महत्वपूर्ण है कि इसे सही, स्वच्छ और ठोस बनाया जाए।

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

.NET में माइक्रो-ऑप्टिमाइज़ेशन लगभग इसके लायक नहीं हैं (मैं 99.99% मामलों के बारे में बात कर रहा हूं)। C / C ++ में, हो सकता है, यदि आप जानते हैं कि आप क्या कर रहे हैं। .NET वातावरण में काम करते समय, आप पहले से ही हार्डवेयर की धातु से काफी दूर हैं कि कोड निष्पादन में महत्वपूर्ण ओवरहेड है। इसलिए, यह देखते हुए कि आप पहले से ही एक ऐसे वातावरण में हैं जो इंगित करता है कि आपने ब्लिस्टरिंग गति को छोड़ दिया है और इसके बजाय "सही" कोड लिखना चाहते हैं, अगर .NET वातावरण में कुछ वास्तव में तेजी से पर्याप्त काम नहीं कर रहा है, या तो इसकी जटिलता है बहुत अधिक है, या आपको इसे समानांतर करने पर विचार करना चाहिए। अनुकूलन के लिए अनुसरण करने के लिए यहां कुछ बुनियादी संकेत दिए गए हैं; मैं आपको अनुकूलन में आपकी उत्पादकता की गारंटी देता हूं (समय व्यतीत करने के लिए प्राप्त की गई गति) आसमान छू जाएगी:

  • गुणांक बदलने से अधिक फ़ंक्शन आकार मायने रखता है - WRT बिग-ओह जटिलता, आप उन चरणों की संख्या कम कर सकते हैं जिन्हें एन 2 एल्गोरिथ्म में आधे से निष्पादित किया जाना चाहिए , और आपके पास अभी भी एक द्विघात-जटिलता एल्गोरिथ्म है, जिसमें यह निष्पादित होता है आधा समय यह इस्तेमाल किया। यदि इस प्रकार की समस्या के लिए यह जटिलता की निचली सीमा है, तो ऐसा ही हो, लेकिन अगर एक ही समस्या का NlogN, रैखिक या लघुगणक समाधान है, तो आप अपने पास मौजूद अनुकूलन को कम करके एल्गोरिदम को स्विच करके अधिक लाभ प्राप्त करेंगे।
  • सिर्फ इसलिए कि आप जटिलता को नहीं देख सकते हैं इसका मतलब यह नहीं है कि यह आपको महंगा नहीं है - शब्द में बहुत से सुरुचिपूर्ण एक-लाइनर बहुत अच्छा प्रदर्शन करते हैं (उदाहरण के लिए, रेक्सक्स प्राइम चेकर एक घातीय-जटिलता फ़ंक्शन है, जबकि कुशल मुख्य मूल्यांकन जिसमें सभी वर्ग संख्याओं को उसकी वर्गमूल से कम संख्या में विभाजित करना शामिल है, O (Nlog (sqrt (N))) के क्रम पर है । Linq एक महान पुस्तकालय है क्योंकि यह कोड को सरल करता है, लेकिन SQL इंजन के विपरीत, .NET। संकलक अपनी क्वेरी को निष्पादित करने का सबसे कुशल तरीका खोजने का प्रयास नहीं करेगा। आपको यह जानना होगा कि जब आप किसी विधि का उपयोग करते हैं तो क्या होगा, और इस प्रकार एक विधि और तेज हो सकती है यदि उत्पादन करते समय पहले (या बाद में) श्रृंखला में रखा जाए। वही परिणाम।
  • OTOH, हमेशा स्रोत जटिलता और रनटाइम जटिलता के बीच एक व्यापार है - SelectionSort को लागू करना बहुत आसान है; आप शायद इसे 10LOC या उससे कम में कर सकते हैं। MergeSort थोड़ा अधिक जटिल है, Quicksort अधिक है, और RadixSort और भी अधिक। लेकिन, जैसे-जैसे एल्गोरिथ्म कोडिंग जटिलता में वृद्धि होती है (और इस तरह "अप-फ्रंट" विकास समय), वे रनटाइम जटिलता में कमी करते हैं; MergeSort और QuickSort NlogN हैं, और RadixSort को आम तौर पर रैखिक माना जाता है (तकनीकी रूप से यह NlogM है जहाँ M N में सबसे बड़ी संख्या है)।
  • तेजी से तोड़ें - अगर कोई ऐसा चेक है, जो सस्ते में बनाया जा सकता है, जिसके सही होने की काफी संभावना है और इसका मतलब है कि आप आगे बढ़ सकते हैं, तो पहले चेक करें। यदि आपका एल्गोरिथ्म, उदाहरण के लिए, केवल 1, 2, या 3 में समाप्त होने वाली संख्याओं की परवाह करता है, तो सबसे अधिक संभावना मामला (पूरी तरह से यादृच्छिक डेटा दिया गया) एक संख्या है जो कुछ अन्य अंकों में समाप्त होती है, इसलिए परीक्षण करें कि संख्या में अंत नहीं है 1, 2, या 3, यह देखने के लिए कि क्या 1, 2, या 3. में संख्या समाप्त होती है या नहीं, यह देखने के लिए कि क्या तर्क के एक टुकड़े के लिए A & B की आवश्यकता है, और P (A) = 0.9 जबकि P (B) = 0.1 है, तो जाँच करें B पहला, जब तक कि अगर! A तब! B (जैसे if(myObject != null && myObject.someProperty == 1)), या B मूल्यांकन करने के लिए A की तुलना में 9 गुना अधिक समय लेता है ( if(myObject != null && some10SecondMethodReturningBool()))।
  • ऐसा कोई भी प्रश्न न पूछें, जिसका उत्तर आपको पहले से पता हो - यदि आपके पास "फॉल-थ्रू" स्थितियों की एक श्रृंखला है, और उन स्थितियों में से एक या अधिक सरल स्थिति पर निर्भर हैं जिन्हें भी जांचना आवश्यक है, तो कभी भी दोनों की जांच न करें ये स्वतंत्र रूप से। उदाहरण के लिए, यदि आपके पास एक चेक है जिसके लिए A की आवश्यकता है, और A && B के लिए एक चेक की आवश्यकता है, तो आपको A की जाँच करनी चाहिए, और यदि आपको B की जाँच करनी चाहिए, तो A!, तो! A && B, को भी परेशान न करें।
  • जितना अधिक बार आप कुछ करते हैं, उतना ही आपको ध्यान देना चाहिए कि यह कैसे किया जाता है - यह कई स्तरों पर विकास में एक सामान्य विषय है; एक सामान्य विकास के अर्थ में, "यदि एक सामान्य कार्य समय लेने वाला या काल्पनिक है, तो इसे तब तक करते रहें जब तक कि आप निराश और जानकार दोनों बेहतर तरीके से आने के लिए पर्याप्त न हों"। कोड शब्दों में, एक अक्षम एल्गोरिथ्म जितनी बार चलाया जाता है, उतना ही आप इसे अनुकूलित करके समग्र प्रदर्शन में प्राप्त करेंगे। प्रोफाइलिंग टूल हैं जो एक बाइनरी असेंबली और इसके डिबग प्रतीकों को ले सकते हैं और आपको दिखा सकते हैं, कुछ उपयोग के मामलों के माध्यम से चलने के बाद, कोड की कौन सी लाइनें सबसे ज्यादा चलती थीं। उन पंक्तियों, और उन पंक्तियों को चलाने वाली पंक्तियाँ, वे हैं जिन पर आपको सबसे अधिक ध्यान देना चाहिए, क्योंकि आपके द्वारा प्राप्त दक्षता में कोई भी वृद्धि कई गुना अधिक होगी।
  • यदि आप इस पर पर्याप्त हार्डवेयर फेंकते हैं तो एक अधिक जटिल एल्गोरिथ्म एक कम जटिल एल्गोरिथ्म की तरह दिखता है । कुछ समय ऐसे होते हैं जहाँ आपको यह महसूस करना होता है कि आपका एल्गोरिथ्म सिस्टम की तकनीकी सीमाओं (या उसके हिस्से) के पास आ रहा है, जिस पर आप इसे चला रहे हैं; उस बिंदु से यदि इसे और तेज़ करने की आवश्यकता है, तो आप इसे बेहतर हार्डवेयर पर चलाकर अधिक लाभ प्राप्त करेंगे। यह समानांतरकरण पर भी लागू होता है; N 2 -complexity एल्गोरिथ्म, जब N कोर पर चलाया जाता है, तो रेखीय दिखता है। इसलिए, यदि आप सुनिश्चित हैं कि आप जिस प्रकार के एल्गोरिथ्म को लिख रहे हैं, उसके लिए निम्न जटिलता से टकराया है, तो "विभाजित और जीत" के तरीकों की तलाश करें।
  • जब यह काफी तेजी से होता है तो तेज होता है - जब तक आप किसी विशेष चिप को लक्षित करने के लिए हाथ से पैकिंग करने वाले असेंबली नहीं होते, तब तक हमेशा कुछ न कुछ प्राप्त होता रहता है। हालाँकि, जब तक आप हाथ से पैकिंग करने वाले असेंबली नहीं बनना चाहते, आपको हमेशा यह ध्यान रखना होगा कि ग्राहक "काफी अच्छा" क्या कहेगा। फिर, "समय से पहले अनुकूलन सभी बुराई की जड़ है"; जब आपका ग्राहक इसे पर्याप्त तेज़ी से कहता है, तो आप तब तक कर सकते हैं जब तक वह यह नहीं सोचता कि यह अब और तेज़ नहीं है।

0

जल्दी से अनुकूलन के बारे में चिंता करने का एकमात्र समय तब होता है जब आप जानते हैं कि आप किसी ऐसी चीज से निपट रहे हैं जो या तो बहुत बड़ी है या कुछ ऐसा है जिसे आप जानते हैं कि यह बहुत बड़ी संख्या में निष्पादित होगी।

"विशाल" की परिभाषा स्पष्ट रूप से इस आधार पर बदलती है कि आपके लक्ष्य सिस्टम क्या हैं।


0

मैं केवल दो लाइन संस्करण को पसंद करूंगा क्योंकि यह डिबगर के साथ कदम रखना आसान है। कई एम्बेडेड कॉल के साथ एक पंक्ति इसे और अधिक कठिन बना देती है।

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