2009-10-19 23 views
12

"अत्यधिक अनुकूलित कोड" या कुछ डेवलपर को उनके और अनुकूलित करने के लिए अनुकूलित करने की आवश्यकता के बारे में सुनना आम बात है। हालांकि, एक आत्म-सिखाए जाने वाले, नए प्रोग्रामर के रूप में मैंने कभी नहीं समझा है कि ऐसी चीजों के बारे में बात करते समय लोगों का क्या मतलब है।अनुकूलन! - यह क्या है? यह कैसे किया जाता है?

इसके सामान्य विचार को समझाने के लिए देखभाल? साथ ही, कुछ पढ़ने की सामग्री और वास्तव में जो भी आप इस मामले पर कहने की तरह महसूस करते हैं उसकी अनुशंसा करते हैं। रान और प्रचार करने के लिए स्वतंत्र महसूस करें।

+0

मेरा सुझाव है कि आप अपने प्रश्न के दायरे को सीमित करें। अभी, उत्तर इस विषय पर विकिपीडिया के लेख की प्रतिलिपि बनाने और चिपकाने के लिए भी हो सकता है, क्योंकि यह इतना व्यापक है। –

+0

विकिपीडिया के लिए एक लिंक पोस्ट नहीं कर रहा है तो सवाल का एक अच्छा जवाब है? –

+2

@ किनोपिको - उत्तर जो केवल बाहरी लिंक से जुड़े हैं, निराश हैं। Http://meta.stackexchange.com/questions/26100/some-opleople-just-do-not-know-how-to-search –

उत्तर

1

ऑप्टिमाइज़ेशन का मतलब है कि ऐसी चीजों के लिए कंप्यूटर प्रोग्राम को बेहतर बनाने की कोशिश करना। सवाल बहुत व्यापक है, क्योंकि अनुकूलन में कंपेलरों को गति के लिए कार्यक्रमों में सुधार, या मनुष्य ऐसा करने में शामिल हो सकते हैं।

+0

हैलो, जॉन वेन। हॉलीवुड आपसे कैसे व्यवहार कर रहा है? –

+0

अपने घोड़े से निकलें और अपना दूध पीएं। –

26

ऑप्टिमाइज़ एक शब्द है जिसका उपयोग हम आलसी रूप से "किसी निश्चित तरीके से कुछ बेहतर बनाने" के लिए करते हैं। हम शायद ही कभी कुछ "अनुकूलित" करते हैं - अधिक, हम इसे तब तक सुधारते हैं जब तक कि यह हमारी अपेक्षाओं को पूरा न करे।

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

वन के लिए अनुकूलन कर सकते हैं:

  • मेमोरी खपत - एक प्रोग्राम या एल्गोरिथ्म के क्रम आकार छोटा करें ।

  • सीपीयू खपत - एल्गोरिदम computationally कम गहन बनाओ।

  • दीवार समय - के बजाय कंप्यूटर के लिए बेहतर अपने अनुप्रयोग बनाने, आप इसे आसान मनुष्य इसे पढ़ने के लिए के लिए कर सकते हैं - जो कुछ भी यह कुछ तेजी से

  • पठनीयता बनाने के लिए ले जाता है मत करो।

कुछ सामान्य (और वह बहुत सामान्यीकृत) तकनीक कोड का अनुकूलन करने में शामिल हैं: प्रदर्शन विशेषताओं में सुधार करने के

  • बदलें एल्गोरिथ्म। यदि आपके पास एक एल्गोरिदम है जो O (n^2) समय या स्थान लेता है, तो उस एल्गोरिदम को प्रतिस्थापित करने का प्रयास करें जो O (n * log n) लेता है।

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

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

+2

अच्छी तरह से जवाब बाहर सोचा। – carl

+3

ओ (एन^2) का मतलब है कि समस्या के आकार (एन) आकार में युगल हर बार 4 गुना धीमा हो जाता है। एक नेस्टेड लूप की कल्पना करें जो हर मूल्य को हर दूसरे मूल्य की तुलना करता है। हर बार जब हम मूल्यों की संख्या को दोगुना करते हैं, तो हम काम की मात्रा को चौगुनी करते हैं। - तो एक एल्गोरिदम ओ (एन लॉग एन) बनाने का मतलब है कि आप बेहतर काम करने की कोशिश कर रहे हैं, कठिन नहीं। –

5

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

सोचें:

a=(b+c)*3-(b+c) 

जो

 - 
    *  + 
    + 3 b c 
    b c 

में अनुवाद किया जाता है एक पार्सर के लिए यह स्पष्ट है कि अपने 2 वंश के साथ + नोड समान हैं होगा, इसलिए वे एक अस्थायी चर, टी में विलय हो जाएंगे, और पेड़ को फिर से लिखा जाएगा:

 - 
    *  t 
    t 3 

एन ow एक और भी बेहतर पार्सर देखना होगा कि जब टी एक पूर्णांक है, पेड़ आगे करने के लिए सरल किया जा सकता है:

 * 
    t  2 

और मध्यस्थ कोड है कि आप पर अपने कोड पीढ़ी कदम चलाने था अंत में होगा

int t=b+c; 
a=t*2; 

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

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

+1

अपने गणित की जांच करें, अच्छा सर: 3x - 1x! = 4x –

+0

मैं किस संकेत के माध्यम से आधा रास्ता भूल गया .. तय! – Blindy

+1

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

4

यहां कुछ अनुकूलन का एक उदाहरण है (खराब तरीके से निर्णय लेने को ठीक करना) जो मैंने हाल ही में किया था। यह बहुत ही बुनियादी है, लेकिन मुझे आशा है कि यह दिखाता है कि अच्छे लाभों को सरल परिवर्तनों से भी बनाया जा सकता है, और 'अनुकूलन' जादू नहीं है, यह केवल कार्य को पूरा करने के लिए सर्वोत्तम निर्णय लेने के बारे में है।

एक आवेदन में मैं काम कर रहा था वहां कई लिंक्डलिस्ट डेटा संरचनाएं थीं जिनका उपयोग foo के विभिन्न उदाहरणों को करने के लिए किया जा रहा था।

जब एप्लिकेशन उपयोग में था, तो अक्सर यह देखने के लिए जांच की जाती थी कि लिंकडलिस्ट में ऑब्जेक्ट एक्स है या नहीं। चूंकि एक्स की बढ़ोतरी बढ़ने लगी है, मैंने देखा कि एप्लिकेशन जितना धीमा हो रहा था उससे अधिक धीरे-धीरे प्रदर्शन कर रहा था।

मैंने एक प्रोफाइलर चलाया, और महसूस किया कि प्रत्येक 'myList.Contains (x)' कॉल में ओ (एन) था क्योंकि सूची को प्रत्येक आइटम के माध्यम से फिर से चालू करना होता है जब तक कि यह अंत तक नहीं पहुंच जाता है या एक मैच नहीं मिलता है। यह निश्चित रूप से प्रभावशाली नहीं था।

तो मैंने इस कोड को अनुकूलित करने के लिए क्या किया? मैंने अधिकांश लिंक्डलिस्ट डेटास्ट्रक्चर को हैशसेट्स में स्विच किया है, जो ओ (1) में 'कॉन्टेन्स (एक्स)' कॉल कर सकता है - बहुत बेहतर।

+1

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

8

मैं ज्यादातर व्यावहारिक सलाह के साथ rant होगा।

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

आप को मापने के लिए जो कुछ भी नहीं कर सकते हैं उसे ठीक नहीं कर सकते। अपनी प्रोग्राम रिपोर्ट को कुछ प्रदर्शन बुनियादी ढांचे के माध्यम से करें जो यह करता है और जो समय लगता है। मैं Win32 पृष्ठभूमि से आया हूं इसलिए मुझे प्रदर्शन काउंटर पर उपयोग किया जाता है और मैं अपने कोड पर उन्हें छिड़कने में बेहद उदार हूं। मैं भी automatized the code to generate them

और अंत में अनुकूलन के बारे में कुछ शब्द। ऑप्टिमाइज़ेशन के बारे में अधिकतर चर्चा मैं किसी भी कंपाइलर को आपके लिए अनुकूलित करने के लिए अनुकूलित करने पर सामान पर ध्यान केंद्रित करता हूं। मेरे अनुभव में 'अत्यधिक अनुकूलित कोड' के लिए लाभ का सबसे बड़ा स्रोत पूरी तरह से कहीं और है: मेमोरी एक्सेस। आधुनिक आर्किटेक्चर पर सीपीयू ज्यादातर बार निष्क्रिय हो रहा है, इसकी पाइपलाइनों में मेमोरी की सेवा की प्रतीक्षा है। एल 1 और एल 2 कैश के बीच, TLB याद आती है, NUMA क्रॉस-नोड पहुंच और यहां तक ​​कि GPF जो पृष्ठ को डिस्क से लाती है, आधुनिक एप्लिकेशन का मेमोरी एक्सेस पैटर्न एक सबसे महत्वपूर्ण अनुकूलन है जो कोई भी कर सकता है। मैं थोड़ा अतिरंजित कर रहा हूं, बेशक काउंटर उदाहरण वर्क-लोड होगा जो इस तकनीक को स्मृति एक्सेस इलाके में लाभ नहीं पहुंचाएगा। लेकिन ज्यादातर आवेदन करेंगे। विशिष्ट होने के लिए, इन तकनीकों का क्या मतलब सरल है: अपने डेटा को मेमोरी में क्लस्टर करें ताकि एक सीपीयू एक कड़े मेमोरी रेंज को काम कर सके जिसमें इसकी सभी ज़रूरतें हों, आपकी कैश लाइनों या आपके वर्तमान पृष्ठ के बाहर मेमोरी का कोई महंगा संदर्भ न हो। अभ्यास में इसका अर्थ कॉलम के बजाए पंक्तियों द्वारा सरणी के रूप में सरल के रूप में कुछ आसान हो सकता है।

हम चाहते हैं कि आधुनिक आर्किटेक्चर का तर्क:

मैं तुम्हें Alpha-Sort paper presented at the VLDB conference 1995 में इस पत्र कैसे कैश संवेदनशील एल्गोरिदम के लिए बनाया गया आधुनिक सीपीयू आर्किटेक्चर विशेष रूप से के लिए वर्ष पिछले मानक पानी से बाहर उड़ा सकते हैं प्रस्तुत पढ़ने की सिफारिश करेंगे को पर एल्गोरिदम डिजाइनर की आवश्यकता है पदानुक्रम के उपयोग के दोबारा जांच करें। AlphaSort क्लस्टर का उपयोग करता है डेटा संरचनाओं अच्छा कैश इलाके पाने के लिए ...

+0

अच्छी तरह से लिखित उत्तर, लेकिन _what_ अनुकूलन पूछने वाले किसी व्यक्ति की सहायता नहीं करता है। –

+2

ऐसे कई अन्य उत्तर हैं जो इसे संबोधित करते हैं, और यह पूरे मुद्दे का एक महत्वपूर्ण हिस्सा है। –

1

मैं सुझाव है कि आप पहले सिद्धांत का एक सा पढ़ा (किताबों से, या गूगल व्याख्यान स्लाइड के लिए):

  • डाटा संरचनाओं और एल्गोरिदम - ओ() नोटेशन क्या है, इसकी गणना कैसे करें, ओ-कॉम्प्लेटी
    बुक: थॉमस एच। कॉर्मन, चार्ल्स ई। लीसरसन द्वारा एल्गोरिदम का परिचय, और क्या डेटास्ट्रक्चर और एल्गोरिदम का उपयोग किया जा सकता है। रोनाल्ड एल। रिवेस्ट

  • संकलनकर्ता और विधानसभा - कैसे कोड मशीन निर्देशों के अनुवाद किया है

  • कंप्यूटर वास्तुकला - कैसे सीपीयू, रैम, कैश, शाखा भविष्यवाणियों, आदेश निष्पादन से बाहर ... काम

  • ऑपरेटिंग प्रणाली - कर्नेल मोड, उपयोगकर्ता मोड, समय निर्धारण प्रक्रियाओं/धागे, mutexes, संकेतबाहु, संदेश कतार

प्रत्येक का एक सा पढ़ने के बाद, आप सभी भिन्नता की एक बुनियादी समझ होनी चाहिए अनुकूलन के पूर्व पहलुओं।

नोट: मैं विकी-एड करता हूं ताकि लोग पुस्तक की सिफारिशें जोड़ सकें।

+0

मुझे यकीन नहीं है कि सीएलआर एक पुस्तक है जिसे मैं किसी ऐसे व्यक्ति को सलाह दूंगा जो सिर्फ एल्गोरिदम के बारे में सीख रहा हो। –

+0

यही वह पुस्तक है जिसे मुझे छात्र के रूप में पढ़ाया गया था। कोई अन्य सिफारिशें? –

1

मैं इस विचार के साथ जा रहा हूं कि कोड को अनुकूलित करना एक ही परिणाम कम समय में प्राप्त करना है। और पूरी तरह अनुकूलित केवल इसका मतलब है कि वे इसे तेजी से बनाने के लिए विचारों से बाहर चले गए। मैंने "पूरी तरह से अनुकूलित" कोड के दावों पर घृणा की बड़ी बाल्टी फेंक दी! ऐसा कुछ भी नहीं है।

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

तो आपके चक्र कहां जा रहे हैं? आप शायद मुख्य स्मृति से आने वाले डेटा की प्रतीक्षा कर रहे हैं। एल 1 & एल 2 कैश पर पढ़ें। यह समझना कि कैसे कैश काम करता है आधा लड़ाई है। संकेत: तंग, कॉम्पैक्ट संरचनाओं का उपयोग करें जो कैश-लाइन में अधिक फिट होंगे।

अनुकूलन बहुत मजेदार है। और यह कभी खत्म नहीं होता :)

अनुकूलन पर एक महान पुस्तक लिखना महान कोड है: रैंडल हाइड द्वारा मशीन को समझना।

2

अनुकूलन एक कार्यक्रम का अर्थ है:

  • एक एल्गोरिथ्म कम संचालन का उपयोग करता है लगता है: इसे चलाने के तेजी से

    तेजी से कार्यक्रम बनाने का एक ही तरीका है यह करने के कम कर रहा है बनाने के (उदाहरण के लिए एन^2 के बजाय एन लॉग एन)

  • अपनी मशीन के धीमे घटकों से बचें (मुख्य मेमोरी के बजाय कैश में ऑब्जेक्ट्स रखें, या डी के बजाय मुख्य मेमोरी में रखें ISK); स्मृति खपत को कम करने से लगभग हमेशा मदद मिलती है!

इसके अलावा नियम:

  • अनुकूलन के अवसरों की तलाश में, 80-20 नियम का पालन: ठेठ प्रोग्राम कोड का 20% निष्पादन समय के 80% के लिए खातों।
  • प्रत्येक प्रयास अनुकूलन से पहले और बाद में मापें; अक्सर पर्याप्त, अनुकूलन नहीं करते हैं।
  • प्रोग्राम ठीक से चलने के बाद ही अनुकूलित करें!
इसके अलावा

, वहाँ एक कार्यक्रम दिखाई तेजी से होने के लिए बनाने के लिए तरीके हैं:

  • बैक-एंड कार्यों से अलग जीयूआई घटना प्रसंस्करण; फ्रंट एंड "स्नैपी" रखने के लिए बैक-एंड गणना के विरुद्ध उपयोगकर्ता-दृश्य परिवर्तनों को प्राथमिकता दें
  • उपयोगकर्ता को लंबे परिचालन करने के दौरान कुछ पढ़ने के लिए देता है (प्रत्येक ने इंस्टॉलर्स द्वारा प्रदर्शित स्लाइडशो को देखा है?)
+1

"प्रोग्राम को अनुकूलित करना" का अर्थ यह नहीं है कि "इसे तेजी से चलाएं।" यह एक बहुत ही विशिष्ट बयान नहीं है। "गति के लिए एक कार्यक्रम को अनुकूलित करना", उदाहरण के लिए, इसका मतलब होगा। कैननिकल टाइम और स्पेस ऑप्टिमाइज़ेशन के अलावा अन्य लोगों ने इस सवाल के जवाब में उल्लेख किया है, कोई भी बिजली के लिए अनुकूलित कर सकता है (उदाहरण के लिए सीपीयू जितना संभव हो उतना कम पावर स्टेटस में रहने की इजाजत देता है)। मुद्दा यह है कि किसी के बारे में स्पष्ट होना चाहिए * किस प्रकार का अनुकूलन वे संदर्भित कर रहे हैं। – Void

+0

निश्चित रूप से, आप किसी भी चीज़ के लिए अनुकूलित कर सकते हैं - निष्पादन समय, विकास का समय, स्मृति खपत, स्टार्टअप समय, ऊर्जा खपत, कोड की योग्यता, डिस्क उपयोग, प्रशंसक शोर। लेकिन सवाल "अत्यधिक अनुकूलित कोड" के अर्थ के बारे में था, और लगभग हमेशा "गति के लिए अनुकूलित" का अर्थ है। – mfx

0

सुनिश्चित करें कि आपका एप्लिकेशन इसे अनुकूलित करना शुरू करने से पहले सही परिणाम उत्पन्न करता है।

3

यह एक अच्छा सवाल है।

आमतौर पर सबसे अच्छा अभ्यास 1 है) केवल कोड लिखने के लिए जो आपको करने की ज़रूरत है, 2) फिर प्रदर्शन के साथ सौदा करें, लेकिन केवल अगर यह कोई समस्या है। यदि कार्यक्रम "पर्याप्त तेज़" है तो यह कोई मुद्दा नहीं है।

यदि कार्यक्रम पर्याप्त तेज़ नहीं है (जैसे यह आपको प्रतीक्षा करता है) तो कुछ प्रदर्शन ट्यूनिंग आज़माएं। प्रदर्शन ट्यूनिंग प्रोग्रामिंग की तरह नहीं है। प्रोग्रामिंग में, आप पहले सोचते हैं और फिर कुछ करते हैं। प्रदर्शन ट्यूनिंग में, पहले सोचना एक गलती है, क्योंकि अनुमान है।

अनुमान लगाने के लिए कि क्या ठीक करना है; निदान करें कि कार्यक्रम क्या कर रहा है। हर कोई जानता है कि, लेकिन ज्यादातर वे इसे वैसे भी करते हैं। यह कहना स्वाभाविक है कि "एक्स, वाई, या जेड समस्या हो सकती है" लेकिन केवल नौसिखिया अनुमान पर कार्य करता है। प्रो कहते हैं "लेकिन मैं शायद गलत हूँ"।

प्रदर्शन समस्याओं का निदान करने के विभिन्न तरीके हैं।

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

दूसरा एक प्रोफाइलिंग टूल प्राप्त करना है, और जैसा कि अन्य कहते हैं, मापें, मापें, मापें।

व्यक्तिगत रूप से मुझे मापने की परवाह नहीं है। मुझे लगता है कि प्रदर्शन समस्याओं को इंगित करने के उद्देश्य से यह एक अस्पष्ट माइक्रोस्कोप है। मैं this method, और this is an example of its use पसंद करता हूं।

शुभकामनाएं।

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

2

हालांकि, एक आत्म-सिखाए जाने वाले, नए प्रोग्रामर के रूप में मैंने कभी नहीं समझा है कि ऐसी चीजों के बारे में बात करते समय लोगों का वास्तव में क्या मतलब है।

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

इसलिए, जो कोई आपको बताता है कि एक विधि एक और की तुलना में तेजी है, वहाँ एक अच्छी संभावना है वे सिर्फ अनुमान लगा रहे हैं जब तक कि तीन बातों में से एक सत्य हैं:

  1. वे डेटा है
  2. वे एक एल्गोरिदम चुनना जो वे जानते हैं तेज़ी से गणितीय है।
  3. वे एक डेटा संरचना चुन रहे हैं जो वे जानते हैं कि तेजी से गणितीय है।
संबंधित मुद्दे