मुझे सूक्ष्म प्रदर्शन और प्रभावकारिता की परवाह क्यों करनी चाहिए?


71

C / C ++ पृष्ठों पर कई प्रश्न और उत्तर, विशेष रूप से या परोक्ष रूप से सूक्ष्म प्रदर्शन मुद्दों पर चर्चा करते हैं (जैसे कि एक अप्रत्यक्ष बनाम प्रत्यक्ष इनलाइन फ़ंक्शन का ओवरहेड), या O (N 2 ) बनाम O (N लॉग एन) एल्गोरिथ्म का उपयोग करना एक 100 आइटम सूची।

मैं हमेशा माइक्रो प्रदर्शन के बारे में कोई चिंता नहीं करता हूं, और मैक्रो प्रदर्शन के बारे में थोड़ी चिंता करता हूं, जब तक मुझे पता है कि मुझे समस्या है, तब तक बनाए रखने के लिए आसान, विश्वसनीय कोड पर ध्यान केंद्रित करना।

मेरा सवाल है कि ऐसा क्यों है कि बड़ी संख्या में प्रोग्रामर इतनी देखभाल करते हैं? क्या यह वास्तव में अधिकांश डेवलपर्स के लिए एक मुद्दा है, क्या मैं सिर्फ इतना भाग्यशाली हूं कि मुझे इसके बारे में बहुत अधिक चिंता नहीं करनी चाहिए, या मैं एक बुरा किसान हूं?


5
+1, अच्छा सामान्य प्रश्न।
आईमिलिंड

+1 अच्छा प्रश्न..मैंने 2 टैग जोड़े हैं .. आशा है कि आप इस बारे में बुरा नहीं मानते।

2
मैं दो महान उद्धरण 1) "समय से पहले अनुकूलन सभी बुराई की जड़ है।" 2) आपके समय का 80% आपके कोड (80/20 नियम) के 20% खर्च किया जाएगा।
जेम्स खौर्य

2
मुझे लगता है कि मेरे O (n * n) उदाहरण के बारे में कुछ उत्तर दिए गए हैं। मैंने स्पष्ट रूप से 100 वस्तुओं की एक सूची निर्दिष्ट की है, फिर भी वे अभी भी जोर देकर कहते हैं कि O (nlogn) बेहतर है, स्पष्ट रूप से प्रदर्शन में सुधार बताते हुए यदि सूची में, फर्स्ट में 1000 या मिलियन हो जाता है। क्या यह सूक्ष्म अनुकूलन जुनून है क्योंकि प्रोग्रामर संभावित भविष्य की आवश्यकताओं के बजाय वास्तविक उत्सुक आवश्यकताओं के लिए प्रोग्राम कर रहे हैं? (मैंने कहाँ सुना है कि पहले ...)
मैट्नज़

5
@ डोनाल्ड नथ से पूरा उद्धरण "हमें छोटी क्षमताओं के बारे में भूलना चाहिए, समय के 97% के बारे में कहना चाहिए: समय से पहले अनुकूलन सभी बुराई की जड़ है"। इस थ्रेड में शेष 3% के बारे में कुछ अच्छे उत्तर होंगे।
स्टुपरयूजर

जवाबों:


14

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

सबसे आसान जालों में से एक - विशेष रूप से सी और सी ++ में गिरने के लिए जहां आपके पास इस तरह के महीन दाने का नियंत्रण होता है - बहुत जल्दी अनुकूलन कर रहा है, और बहुत ठीक स्तर पर। सामान्य तौर पर नियम यह है: A) तब तक ऑप्टिमाइज़ न करें जब तक आपको पता न चले कि आपको कोई समस्या है, और B) किसी भी चीज़ को ऑप्टिमाइज़ नहीं करते हैं जिसे आपने प्रॉफ़ाइलर का उपयोग करके समस्या क्षेत्र साबित नहीं किया है।

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


6
एक और एक: इनिशियलाइज़ेशन कोड जो एक बार निष्पादित होता है, आमतौर पर अनुकूलन की आवश्यकता नहीं होती है, इसलिए कहीं और देखें।
माइक डीसिमोन

3
कितनी बार "एक बार" पर निर्भर करता है। दौड़ते समय ./configure, मैं कहता हूं कि रन के 75% समय को स्क्रिप्ट के चलने वाले कार्यक्रमों में "इनिशियलाइज़ेशन" कोड पर खर्च किया जा सकता है। 25-50% भी डायनेमिक लिंकिंग पर खर्च किया जा सकता है।
आर ..

12
नियम A एक भयानक नियम है। किसी सिस्टम का आर्किटेक्चर प्रदर्शन में एक भूमिका निभाता है, और यदि आपको बाद में पता चलता है कि आपका आर्किटेक्चर बस आपके प्रदर्शन की आवश्यकताओं का समर्थन नहीं कर सकता है तो आप मूल रूप से खराब हो जाते हैं। इसलिए जब आप बारीक विवरणों को पास करने में सक्षम होते हैं, तो शुरुआत में इस बात को पूरी तरह से नजरअंदाज करना बिल्कुल गलत है।
edA-qa मोर्ट-ओर-वाई

3
@ edA-qa: मैं ऐसा सोचता था, लेकिन पिछले कुछ वर्षों में किसी भी प्रदर्शन पर विचार करने से पहले कई और परियोजनाओं को ठोकर या असफल होने का अनुभव हुआ है। हर बार जब मुझे प्रदर्शन की चिंता होती है, तो फिक्स तुलनात्मक रूप से कम लागत, दिन या कुछ सप्ताह होते हैं, किसी भी अन्य "बग" से अधिक चिंता का विषय विकास में एक निश्चित सुधार नहीं है। हालाँकि, किसी भी otehr रिस्क आइटम जैसे jsut, परफॉरमेंस कोनर्स को प्रोजेक्ट में जल्दी पहचानने और कम करने की आवश्यकता होती है।
मटनज़

5
ओपी ने पूछा कि इतनी देखभाल क्यों की जाती है, और मैं यह देखने में विफल रहता हूं कि यह प्रतिक्रिया वास्तव में सवाल का जवाब कैसे देती है, जब तक कि ओपी किसी को यह कहने में अधिक दिलचस्पी न हो कि "इसके बारे में चिंता मत करो!"।
लाल-गंदगी

54

मुझे लगता है कि आपकी सूची में सब कुछ माइक्रो-ऑप्टिमाइज़ेशन है, जिसे आम तौर पर छोड़कर नहीं देखा जाना चाहिए

100 आइटम सूची में O (n * n) बनाम O (NlogN) एल्गोरिथ्म का उपयोग करना

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

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


36
+1 के लिए "सही एल्गोरिथ्म चुनना कभी भी माइक्रो-ऑप्टिमाइज़ेशन नहीं है।"

9
I + 1 भी होगा, लेकिन ध्यान दें कि जब आपके डेटा का आकार छोटा होना सुनिश्चित हो तो बड़े-ओ-इष्टतम एल्गोरिदम का चयन करना विकास के समय, कार्यक्रम के आकार और शायद स्मृति उपयोग के लिए हानिकारक हो सकता है। यदि आप पोकर हाथों को छाँट रहे हैं, तो क्या आप वास्तव में क्विकसॉर्ट, स्मूथसॉर्ट या मर्जोर्ट लिखना चाहते हैं? मैं सरल प्रविष्टि सॉर्ट के साथ शुरू करूंगा या एक सॉर्टिंग नेटवर्क का उपयोग करूंगा।
आर ..

8
अजीब बात है। माइक्रो-ऑप्टिमाइज़ेशन के बारे में एक थ्रेड में, बहुत सारे कमेंटेटर उत्तरों को माइक्रो-ऑप्टिमाइज़ करते हैं। ;)
सुरक्षित

5
"मैं जल्द ही शर्त लगाने को तैयार हूं कि एक ही कोड कई मिलियन लाइन सूची के लिए पुन: उपयोग होने वाला है": यह पूरी तरह से समस्या डोमेन पर निर्भर करता है। उदाहरण: यदि आप एक शतरंज एल्गोरिथ्म लिख रहे हैं, तो आप सुनिश्चित कर सकते हैं कि बोर्ड का आकार नहीं बदलेगा। यदि आप एक स्वायत्त वाहन प्रोग्राम करते हैं, तो पहियों की संख्या उस तेजी से नहीं बढ़ेगी , या तो।
निकाइ

3
मैं नापसंद करता हूं "सही एल्गोरिदम चुनना कभी भी माइक्रो-ऑप्टिमाइज़ेशन नहीं है" क्योंकि यह OBVIOUSLY सच है, "राइट" शब्द की प्रकृति को देखते हुए। हालांकि, मुझे लगता है कि आपका निहितार्थ वास्तव में "सबसे तेज या सबसे कुशल" एल्गोरिथ्म है, जिससे मैं असहमत हूं। सबसे कुशल एल्गोरिथ्म चुनना गलत विकल्प है अगर इसे लागू करने के लिए समय का भार लगता है और उस सेगमेंट की गति या स्थान शायद ही किसी के लिए भी मायने रखता है।
केसी पैटन

18

एक looooooong समय पहले, अपनी पहली नौकरी में, मैंने एम्बेडेड सिस्टम के लिए कोड लिखा था। इन प्रणालियों में 8086 माइक्रोप्रोसेसरों का उपयोग किया गया था, और सीमित मेमोरी थी। हमने Intel C कंपाइलर का उपयोग किया है। एक प्रणाली जिसे मैंने संरचनाओं के 3-डी सरणी तक पहुंचने के लिए बनाया था। मैंने इसे वैसे ही बनाया जैसे कि पुस्तक ने मुझे बताया: 3 आयामों के लिए मॉलॉक को कॉल करें, फिर अगले आयाम के लिए पंक्तियों को आवंटित करें, फिर अंत नोड के लिए कॉलोक।

यह बहुत जटिल था (उस समय मेरे लिए), मुझे कर्व फिटिंग, एनोवा प्रक्रिया नियंत्रण और ची-स्क्वेयर विश्लेषण करना था। कोई पुस्तकालय नहीं था जो हमारे लिए ऐसा करता था; हमें यह सब लिखना था और इसे 8086 में पूरा करना था।

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


उसी नौकरी पर एक अन्य मामले में, ग्राहक उनकी सांख्यिकीय प्रक्रिया नियंत्रण प्रणाली पर प्रतिक्रिया समय के बारे में शिकायत कर रहा था। मुझसे पहले की टीम ने "सॉफ्टवेयर पीएलसी" सिस्टम डिजाइन किया था जहां ऑपरेटर सिग्नल और ट्रिपिंग स्विच के संयोजन के लिए बूलियन तर्क का उपयोग कर सकते थे। उन्होंने इसे सरल भाषा में लिखा, जिसे आज हम "डोमेन विशिष्ट भाषा" कहेंगे। जैसा कि मुझे याद है कि यह ((A1 + B1) > 4) AND (C1 > C2)बहुत पसंद था।

मूल डिजाइन ने उस स्ट्रिंग का मूल्यांकन और व्याख्या की, जिसका हर बार मूल्यांकन किया गया था। हमारे औसत दर्जे के प्रोसेसर पर, यह बहुत समय खा गया, और इसका मतलब था कि प्रक्रिया नियंत्रक तेजी से अद्यतन नहीं कर सका क्योंकि प्रक्रिया चल रही थी।

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

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


अभी हाल ही में मैं एक ऐसी प्रणाली पर काम कर रहा था, जिसे डायनामिक रूप से XML फ्लाई को पार्स करने की आवश्यकता थी। बड़ी फ़ाइलों को अधिक समय लगेगा। यह बहुत ही संवेदनशील प्रदर्शन था; पार्स के बहुत धीमे होने के कारण UI पूरी तरह अनुपयोगी हो जाएगा।

इस तरह की बातें हर समय सामने आती रहती हैं।


इसलिए .... कभी-कभी आप आसानी से बनाए रखने योग्य, आसानी से लिखने वाला कोड चाहते हैं। कभी-कभी आप कोड चाहते हैं जो जल्दी से चलता है। Tradeoff प्रत्येक प्रोजेक्ट पर आपके द्वारा किए जाने वाले इंजीनियरिंग निर्णय है।


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

6
@CodeInChaos: उत्तर अन्यथा दावा नहीं करता है। यह ओपी के सवाल पर बोलता है "मुझे सूक्ष्म प्रदर्शन और दक्षता की परवाह क्यों करनी चाहिए?" पूर्व-अनुकूलन मुद्दों को केवल अन्य उत्तरदाताओं द्वारा अनुमान लगाया गया था।
वेबबिडीव

12

यदि आप बड़ी छवियों को संसाधित कर रहे हैं और प्रत्येक पिक्सेल पर पुनरावृत्ति कर रहे हैं, तो प्रदर्शन ट्विकिंग महत्वपूर्ण हो सकता है।


2
+1 - भी, उच्च आवृत्ति वित्त, किसी भी तरह का ऑडियो / वीडियो एनकोडर / डिकोडर, सिमुलेशन और मॉडलिंग (जैसे गेम), सिस्टमबद्ध बिट्स जैसे सीपीयू शेड्यूलर और मेमोरी मैनेजर, आदि
बिली ओनली

3
कर सकते हैं महत्वपूर्ण हो, लेकिन है केवल महत्वपूर्ण के बाद आप ऐसा होने के लिए यह साबित हो गया है और आप इसे प्रोफाइल गए होने के लिए जहां आपको लगता है समस्या है। (संकेत: यह शायद वहाँ नहीं है।)
बस मेरा सही चुनाव

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

12

कल्चर के पीछे क्यों होता है इसके बारे में आपको थोड़ा बता देता हूं ।

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

  • हम बड़ी (> 2G) फ़ाइलों को पढ़ने में सक्षम होने के लिए बेवकूफ प्रोग्रामिंग चालें करते थे ...
  • हम निष्पादन योग्य आकार के बारे में चिंता करते थे ...
  • हम इस बात की चिंता करते थे कि हमारे कार्यक्रम कितनी मेमोरी का उपभोग कर रहे हैं ...
  • हमने नियमित रूप से एल्गोरिथम समय बनाम अंतरिक्ष व्यापार-बंद निर्णय लिए ...
  • यहां तक कि पीछे के अंत पर, हम था एक सभ्य नहीं संभाल करने के लिए कुछ भी करने के लिए सी में सीजीआई प्रोग्राम या सी ++ लिखने के लिए। आरपीएस की ... यह तेजी के परिमाण के कई आदेश थे
  • हम डेल्फी / सी ++ / वीबी के बीच प्रदर्शन के गुणों पर परीक्षण चलाते थे!

आज बहुत कम लोगों को इन चीजों के बारे में चिंता है।

हालाँकि, 10 साल पहले आपको अपने सॉफ़्टवेयर के बारे में 56kb मॉडेम पर डाउनलोड होने और 5 साल पुराने पीसी पर चलने की चिंता थी ... क्या आपको याद है कि 1996 में पीसी कितने भद्दे थे? 4GB हार्ड ड्राइव, 200Mhz प्रोसेसर, और 128Mb RAM के संदर्भ में सोचें ...

और 10 साल पहले के सर्वर? डेल के "अगली पीढ़ी" सर्वर की लागत $ 2000 है, और 2 (!) 1Ghz पेंटियम प्रोसेसर, 2 जीबी या राम, और 20 जीबी हार्ड ड्राइव के साथ आया है।

यह बस एक अलग-अलग बॉलगेम था , और उन सभी "वरिष्ठ" इंजीनियरों के पास 10 साल का अनुभव है (दोस्तों आपके सवालों का जवाब देने की संभावना है), उस वातावरण में अपने दांत काटते हैं।


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

1
लूप अनडिंडिंग <कंपकंपी>
लाल-गंदगी

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

9

यहाँ पहले से ही 10 उत्तर हैं और कुछ वास्तव में अच्छे हैं, लेकिन क्योंकि यह मेरा व्यक्तिगत पालतू जानवर है ...

समयपूर्व अनुकूलन जो a) एक साधारण समाधान b की तुलना में अधिक समय लेता है) अधिक कोड का परिचय देता है जहां सरल समाधान आधा आकार और आधा जटिलता होता है और c) चीजों को कम पठनीय बनाता है ABSOLUTELY से बचा जाना चाहिए। हालाँकि, अगर किसी डेवलपर के पास std :: map या std :: वेक्टर का उपयोग करने के बीच कोई विकल्प है और वह प्रदर्शन के लिए शुद्ध अज्ञानता से गलत संग्रह का चयन करता है जो कि समय से पहले अनुकूलन से भी बुरा नहीं है। क्या होगा अगर आप आज अपने कोड को थोड़ा बदल सकते हैं, पठनीयता बनाए रख सकते हैं, उसी जटिलता को बनाए रख सकते हैं, लेकिन इसे और अधिक कुशल बना सकते हैं, क्या आप ऐसा करेंगे? या आप इसे "समय से पहले अनुकूलन" कहेंगे? मुझे लगता है कि बहुत सारे लोग यह भी नहीं देंगे कि कोई भी एक रास्ता या कोई अन्य विचार।

एक बार जब मैं "माइक्रो-ऑप्टिमाइज़ेशन" की सलाह देने वाला लड़का था, जिसे बहुत कम बदलाव की आवश्यकता थी और मुझे वही जवाब दिया गया था जो आपने कहा था, "आपको बहुत जल्दी अनुकूलन नहीं करना चाहिए। चलो बस इसे काम पर लाएँ और हम इसे बदल देंगे।" बाद में अगर कोई प्रदर्शन समस्या है "। हमने इसे ठीक करने से पहले कई रिलीज़ की। और हाँ यह एक प्रदर्शन समस्या थी।

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

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

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


+1: यह श्रिंकवैप सॉफ्टवेयर और वाणिज्यिक वेब साइटों को विकसित करने के लिए काम पर रखे गए लोगों के लिए रोजगार के कारकों में से एक है । रोकथाम ग्राहक के अभिशाप से कम खर्चीला है।
rwong

6

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

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


1
+1 - नोट: "प्रदर्शन" टैग के साथ अधिकांश SO प्रश्न संभवतः उस नमूना त्रुटि का हिस्सा हैं: P
Billy ONeal

3
मुझे यकीन है कि यहाँ समय से पहले-अनुकूलन के सवालों का एक बहुत कुछ देखा गया है ... मुझे लगता है कि यह इस तथ्य से आता है कि बहुत सारे शौक़ीन प्रोग्रामर खेल लिखने के विचार से शुरू करते हैं, और बकवास "अनुकूलन" पुस्तकों का एक बड़ा कोष है। खेल विकास से संबंधित वेबसाइटें जो शुरुआती लोगों के सिर में बुरे विचार डालती हैं। :-)
आर ..

4
जब आप कुछ मुश्किल काम कर रहे होते हैं, तो अक्सर मुश्किल समस्या से ब्रेक लेना आसान हो जाता है और अपने समय की चिंता करना दूर कर देता है कि आपको इसका इस्तेमाल करना चाहिए i++या नहीं++i
Carson63000

@ Carson63000: हाँ जो पूरी तरह से नमूने तिरछा कर सकता है। या वे इस सवाल का जवाब देने में समय बिताते हैं कि मेरा operator ++संकलन क्यों नहीं था।
rwong

4

अन्य उत्तरों के एक जोड़े में एम्बेडेड सिस्टम का उल्लेख है , और मैं इस पर विस्तार करना चाहता हूं।

कम अंत प्रोसेसर वाले बहुत सारे उपकरण हैं, उदाहरण के लिए: आपके घर में बॉयलर नियंत्रक, या एक साधारण पॉकेट कैलकुलेटर, या एक आधुनिक कार के अंदर दर्जनों चिप्स।

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

एक उदाहरण लेने के लिए, माइक्रोकंट्रोलर का एसटीएम 32 परिवार 24 मेगाहर्ट्ज, 16 केबी फ्लैश और 4 केबी रैम से 120 मेगाहर्ट्ज, 1 एमबी फ्लैश और 128 केबी रैम तक जाता है

जब इन जैसे चिप्स के लिए कोड लिखते हैं, तो यह बहुत समय बचाता है यदि आप अपने कोड को पाठ्यक्रम के रूप में यथासंभव कुशल बनाने का लक्ष्य रखते हैं। जाहिर है, समय से पहले अनुकूलन एक बुरा विचार है; लेकिन अभ्यास के साथ, आप सीखते हैं कि कैसे सामान्य समस्याओं को जल्दी और / या न्यूनतम संसाधनों के साथ हल किया जा सकता है, और तदनुसार कोड।


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

2

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

अन्य आधा बस उन उत्सुक लोगों से आता है कि वे धातु के कितने करीब पहुंच सकते हैं। ये अनिवार्य रूप से निम्न-स्तरीय भाषाएं हैं, आखिरकार ...


+1: यह इंगित करने के लायक है कि "पैथोलॉजिकल प्रदर्शन" दुनिया में किसी के लिए भी हो सकता है, भले ही भाषा या प्लेटफ़ॉर्म की परवाह किए बिना। परीक्षण और पढ़ने के लिए निचले स्तर की भाषा में फिर से लागू करने की क्षमता अधिक अंतर्दृष्टि प्रदान कर सकती है , लेकिन हमेशा कार्य समाधान प्रदान नहीं करती है। उदाहरण: "मुझे पता है कि मैं इसे विधानसभा में कर सकता हूं - लेकिन इसे आंशिक-भरोसे के वातावरण में चलाने की जरूरत है!"
11'11

2

जब आप C और C ++ के साथ काम कर रहे होते हैं तो प्रदर्शन हमेशा एक गर्म विषय होता है। कितनी दूर जाना चाहिए, इसके बारे में, आप हमेशा इनलाइन-आईएनजी ASM के बिंदु पर पागल हो सकते हैं, या तेजी से पुनरावृत्ति के लिए सूचक अंकगणितीय का उपयोग कर सकते हैं। हालाँकि, वहाँ एक बिंदु आता है जहाँ कोई इतना समय व्यतीत करता है कि समग्र कार्यक्रम के विकास पर काम करना रुक जाता है।

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

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

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


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

सूचक अंक w / e से तेज़ नहीं है।

2

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

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

उसने कहा, मैं जिस विधि का उपयोग करता हूं वह आपके समान है, लेकिन समान नहीं है:

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

  2. जब कार्यक्रम विकास के अधीन है, तो समय-समय पर प्रदर्शन ट्यूनिंग करें, क्योंकि प्रदर्शन समस्याओं में चुपचाप रेंगने का एक तरीका है। मेरे द्वारा उपयोग की जाने वाली विधि यादृच्छिक-रोक है , क्योंकि मुझे लगता है कि यह सबसे अच्छा है।

यहाँ एक झटका-द्वारा-झटका उदाहरण है कि मेरा क्या मतलब है।


1

ईमानदार होना, यह इस बात पर निर्भर करता है कि आपका उद्देश्य क्या है और क्या आप पेशेवर रूप से या एक शौक के रूप में प्रोग्रामिंग कर रहे हैं।

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

शुरुआती एमआईटी प्रोग्रामर भयानक सामान बनाने के लिए पैदा नहीं हुए थे; उन्होंने मौजूदा एल्गोरिदम को सरल और शक्तिशाली बनाना शुरू कर दिया। उनका गौरव मौजूदा एल्गोरिथ्म की तुलना में दो सेकंड में 4 + 2 देने का था (यह सिर्फ एक उदाहरण है, आपको विचार मिलता है)। उन्होंने प्रदर्शन के लिए लगातार अपने TI-83 मशीनों में कम पंच कार्ड का उपयोग करने की कोशिश की।

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

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


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

वे नहीं करते हैं, लेकिन उनके पास निश्चित रूप से उन पर काम करने के लिए अधिक समय है यदि वे चाहते हैं।

3
मैं इसके विपरीत तर्क दूंगा। मुझे पेशेवर के रूप में किसी चीज पर काम करने के लिए 8 घंटे या उससे अधिक का दिन मिला है। मुझे अपने शौक परियोजनाओं के लिए प्रति दिन 1, शायद 2 घंटे मिलते हैं।
बिली ओनली

1

100 आइटम सूची में O (N2) बनाम O (NlogN) एल्गोरिथ्म का उपयोग करना।

मैं हाल ही में ऐसी ही स्थिति में था। मेरे पास मदों की एक सरणी थी। अपेक्षित मामले में, सूची में दो (!) आइटम थे, और सबसे खराब स्थिति में भी मुझे चार या शायद आठ से अधिक की उम्मीद नहीं थी।

मुझे उस सूची को क्रमबद्ध करने की आवश्यकता थी। निकलता है, std::sortएक सॉर्टिंग नेटवर्क (मूल रूप से बहुत नेस्टेड ifएस) के साथ बदल रहा है जो चल रहे समय के एक बड़े प्रतिशत को काट दिया (मुझे संख्या याद नहीं है लेकिन यह 10-20% की तरह कुछ था)। यह एक माइक्रो-ऑप्टिमाइज़ेशन का एक बड़ा लाभ है, और कोड बिल्कुल प्रदर्शन-महत्वपूर्ण है।

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


1

संचयी ऊर्जा का उपयोग

वहाँ एक जवाब है कि मुझे लगता है कि हमेशा इन चर्चा से गायब है और जो मुझे थोड़ा - संचयी ऊर्जा उपयोग परेशान करता है ।

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

लेकिन जब कुछ मामलों में हजारों, या यहां तक ​​कि लाखों उपयोगकर्ता आपके कोड का उपयोग करते हैं, तो अतिरिक्त अक्षमता बढ़ जाती है। यदि आपका टूल सीपीयू को प्रति दिन केवल दस सेकंड के लिए नींद की स्थिति में प्रवेश करने से रोकता है, और एक मिलियन उपयोगकर्ता इसका उपयोग करते हैं, तो आपका अक्षम एल्गोरिथ्म प्रति दिन अतिरिक्त 140 kWh [1] का उपयोग करता है।

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


[१] मैंने अभी-अभी १० मिलियन वॉट्स के १० मिलियन सेकेंड का समय बनाया है। सटीक आंकड़ा कई चीजों पर निर्भर करता है।


1
आपको जादू शब्द "मोबाइल" का उल्लेख करके सही शुरुआत करनी चाहिए। जब एक डेस्कटॉप प्लेटफ़ॉर्म पर चल रहा है, तो एक एप्लिकेशन जो 1 / 100sec CPU समय लेता है, एक फ्रेम 60 बार खींचने के लिए एक सेकंड "फास्ट" होगा; प्रदर्शन दस गुना बेहतर करने से उपयोगकर्ता को शून्य अंतर होगा। हालांकि, एक मोबाइल प्लेटफॉर्म पर, एक एप्लिकेशन जो 90% सीपीयू उपयोग पर चलता है, बैटरी को 10% पर चलाने की तुलना में बहुत तेज़ी से गुज़ारा कर सकता है।
सुपरकैट

1

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

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

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

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

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

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

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

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


0

जैसा कि आपने उल्लेख किया है, इन मुद्दों के कारण होने वाली कुछ समस्याओं पर ध्यान देने से पहले सूक्ष्म प्रदर्शन के मुद्दों की परवाह करना बेकार है


0

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


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

0

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

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

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

कभी-कभी मेरे जीने में, मैंने सीखा कि उपसर्ग वृद्धि तेजी से होती है ...

for (int i = 0; i < MAX; ++i)

... उपसर्ग वृद्धि से:

for (int i = 0; i < MAX; i++)

अब यदि MAX कम है, तो इससे कोई फर्क नहीं पड़ेगा, और यदि लूप में असली काम है, तो भी कोई फर्क नहीं पड़ेगा। लेकिन पोस्टफ़िक्स संस्करण का उपयोग करने का कोई कारण नहीं है, भले ही आज संकलक कोड को अपने दम पर अनुकूलित करते हैं।

हो सकता है कि प्रदर्शन करने वालों को विकल्पों के बड़े समुद्र में एक दिशानिर्देश रखने के लिए 'वर्किंग कोड और राइटिंग कोड' की तरह 'वर्किंग कोड' लिखने के अलावा एक अतिरिक्त लक्ष्य की आवश्यकता हो।


0

क्या मैं अभी बहुत भाग्यशाली हूं कि मुझे इसके बारे में ज्यादा चिंता नहीं करनी चाहिए, या मैं एक बुरा प्रोग्रामर हूं?

क्या आप अपनी आवश्यकताओं की परवाह करते हैं? यदि प्रदर्शन की आवश्यकता नहीं है, तो इसके बारे में चिंता न करें। इस पर कोई महत्वपूर्ण समय बिताना आपके नियोक्ता के लिए एक असहमति है।

एक हद तक प्रदर्शन हमेशा एक आवश्यकता है। यदि आप इसके बारे में सोचे बिना इसे हिट कर सकते हैं, तो आप इसके बारे में नहीं सोचने में उचित हैं।

व्यक्तिगत रूप से, मैं अक्सर प्रदर्शन से प्रेरित होता हूं जब मेरे परीक्षणों को पारित होने में लंबा समय लगता है। मैं 5 मिनट इंतजार करने के लिए अधीर हूं जबकि परीक्षणों का एक सेट गुजरता है। लेकिन यह आमतौर पर परीक्षणों के साथ सफल होता है।

मेरा सवाल है कि ऐसा क्यों है कि बड़ी संख्या में प्रोग्रामर इतनी देखभाल करते हैं? क्या यह वास्तव में अधिकांश डेवलपर्स के लिए एक मुद्दा है,

बड़ी संख्या में प्रोग्रामर हैं, जो इस बात का औचित्य रखते हैं कि वे कितना ध्यान रखते हैं। बड़ी संख्या में ऐसे लोग हैं जो नहीं हैं। चलो उन लोगों के बारे में बात करते हैं जो नहीं हैं।

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

नुथ सही था: समय से पहले अनुकूलन सभी बुराई की जड़ है। लेकिन एक बार यह काम करता है कि अगला कदम क्या है? जल्दी सही? नहीं! अगला कदम पठनीय है। पठनीय पहला, अगला, मध्य और अंतिम चरण है। जिन लोगों को मैं अनावश्यक प्रदर्शन कर रहा हूँ, उनमें से कई बस के नीचे पठनीयता फेंक रहे हैं।

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

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

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

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

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

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