दिलचस्प पोस्ट
अजगर का उपयोग करके क्रमबद्ध वर्ड फ़्रीक्वेंसी गिनती पता लगाएं कि 24 घंटे डीटेटिम्स के बीच पारित हो चुके हैं – पायथन स्वयं होस्टिंग asp.net mvc पायथन में बहुरेखित टिप्पणियां बनाने का तरीका? PHP में स्वचालित छवि प्रारूप पहचान मैं psql को गैर-परस्पर रूप से पासवर्ड कैसे निर्दिष्ट करूं? धागा नियंत्रण एक प्रोग्राम लिखें जो निश्चित रूप से डेडलॉक में एसक्यूएल के साथ एक रिकॉर्ड के परिवर्तन के आधार पर कई रिकॉर्डों में परिवर्तन करना एचटीटीपी क्लाइंट को अनुरोध के साथ क्रेडेंशियल पास कैसे करें? IE8 ब्राउज़र मोड बनाम दस्तावेज़ मोड क्यों जैसा कि एक चरित्र वेक्टर पर धीमा है? क्या इवेंट घोषणापत्र पर गुमनाम खाली प्रतिनिधि को जोड़ने का एक नकारात्मक पहलू है? वर्तमान पृष्ठ को प्रोग्रामेटिक रूप से प्राप्त करें क्रोम में कीवर्डन सिमुलेशन सामान्य रूप से आग लगती है लेकिन सही कुंजी नहीं है

सबसे हास्यास्पद निराशा क्या है जो आपने देखा है?

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

वेब के समाधान से एकत्रित समाधान "सबसे हास्यास्पद निराशा क्या है जो आपने देखा है?"

एक पुरानी परियोजना पर हमने कुछ (अन्यथा उत्कृष्ट) एम्बेडेड सिस्टम प्रोग्रामर को विरासत में मिला, जिनके पास बड़े पैमाने पर जेड -8000 अनुभव था।

हमारा नया वातावरण 32-बिट स्पार्क सोलारिस था

लोगों में से एक ने सभी कोडों को बदल दिया और शॉर्ट्स को बदल दिया, ताकि हमारे कोड को गति दी जा सके, क्योंकि रैम से 16 बिट्स को हथियाने से 32 बिट्स को हथियाने से तेज था।

मुझे यह दिखाने के लिए एक डेमो प्रोग्राम लिखना पड़ा कि 32-बिट सिस्टम पर 32-बिट मानों को हथियाने से 16-बिट मानों को कब्जाने की तुलना में तेज़ था, और यह समझाने के लिए कि 16-बिट मान को प्राप्त करने के लिए CPU को 32-बिट चौड़ा बनाना था स्मृति का उपयोग करें और फिर 16-बिट मान के लिए आवश्यक बिट्स को नकाब आउट या पाइर करें।

मुझे लगता है कि वाक्यांश "समय से पहले अनुकूलन सभी बुराइयों की जड़ है", जिस तरह से इस्तेमाल किया जाता है कई परियोजनाओं के लिए, यह एक बहाना बन गया है कि प्रोजेक्ट में देर तक काम नहीं किया जाए।

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

मैंने "निष्कासन" की वजह से शुरू की समस्याओं के उदाहरणों की तुलना में गूंगा प्रदर्शन समस्याओं के कई "हास्यास्पद" उदाहरणों को देखा है

  • प्रोग्राम लॉन्च के दौरान वही रजिस्ट्री कुंजी हजारों (या दस हज़ारों) पढ़ना।
  • एक ही DLL सैकड़ों या हजारों बार लोड हो रहा है
  • फ़ाइलों को पूर्ण पथ रखकर स्मृति के मेगा बाइट्स बर्बाद करना
  • डेटा संरचनाओं को व्यवस्थित नहीं कर रहा है, इसलिए वे जरूरत से ज्यादा मेमोरी लेते हैं
  • सभी स्ट्रिंग्स का आकार बदलना जो कि फ़ाइल नाम या पथ को MAX_PATH तक संग्रहीत करता है
  • घटनाओं, कॉलबैक या अन्य सूचना तंत्र वाले चीज़ों के लिए निःशुल्क मतदान

मुझे क्या लगता है कि यह एक बेहतर बयान है: "मापने और समझने के बिना अनुकूलन अनुकूलन बिल्कुल नहीं है – इसका सिर्फ यादृच्छिक परिवर्तन"

अच्छा प्रदर्शन कार्य समय लेने वाला है – अक्सर अधिक ताकि सुविधा या घटक का विकास हो

डेटाबेस निराशाकरण प्लेलैंड हैं

पसंदीदा में शामिल हैं:

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

यह मेरे सिर के ऊपर बंद है

मुझे लगता है कि कोई पूर्ण नियम नहीं है: कुछ चीजें सबसे बेहतर अनुकूलित हैं, और कुछ नहीं हैं।

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

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

तो फिर, कोई पूर्ण नियम नहीं है हां, कभी-कभी अनुकूलन बहुत जल्दी है एक गलती है लेकिन कभी-कभी "सीपीयू / डिस्क स्पेस / मेमोरी सस्ता है" आदर्श वाक्य सभी बुराइयों की वास्तविक जड़ है

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

यहां एक हालिया उदाहरण दिया गया है:

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

मुझे: आप इस पर विचार क्यों कर रहे हैं? समस्या क्या है जिसे आप हल करने की कोशिश कर रहे हैं?

उसे: टेबल एक्स बहुत विस्तृत है, हम इसे प्रदर्शन कारणों के लिए विभाजन कर रहे हैं।

मुझे: क्या आपको लगता है कि यह बहुत व्यापक है?

उसे: सलाहकार ने कहा कि एक तालिका में होने के लिए बहुत सारे स्तंभ हैं।

मुझे: और यह प्रदर्शन को प्रभावित कर रहा है?

उसे: हां, प्रयोक्ता ने आवेदन के XYZ मॉड्यूल में आंतरायिक मंदी की सूचना दी है।

मुझे: आप कैसे जानते हैं कि तालिका की चौड़ाई समस्या का स्रोत है?

उसे: यह कुंजी तालिका XYZ मॉड्यूल द्वारा प्रयोग किया जाता है, और यह 200 कॉलम की तरह है। यह समस्या होना चाहिए

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

उसे: सलाहकार ने कहा कि यह बहुत व्यापक है और हमें उसे बदलने की जरूरत है।

मुझे: यह परामर्शदाता कौन है? मुझे नहीं पता था कि हम एक सलाहकार को काम पर रखा है, न ही उन्होंने विकास दल से बिल्कुल भी बात की।

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

मुझे: उह हुह। इसलिए सलाहकार जो डेटाबेस पुनः डिज़ाइन सेवाएं बेचता है, सोचता है कि हमें एक डेटाबेस पुन: डिजाइन की आवश्यकता है ….

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

  1. कुछ महत्वपूर्ण कॉलम पर अनुपलब्ध अनुक्रमित।
  2. कुछ दुष्ट डेटा विश्लेषक जो समय-समय पर MSAccess के साथ सीधे उत्पादन डेटाबेस से पूछताछ करके मुख्य टेबल लॉक कर रहे थे ("बहुत चौड़ा" एक सहित)

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

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

पूरी तरह से निराशावादी!

कुछ भी पृथ्वी-टूटने, मैं स्वीकार करता हूं, लेकिन जावा में पाश के बाहर स्ट्रिंग्स को जोड़ने के लिए स्ट्रिंगबफर का इस्तेमाल करने वाले लोगों को मैंने पकड़ लिया है यह मोड़ की तरह कुछ आसान था

String msg = "Count = " + count + " of " + total + "."; 

में

 StringBuffer sb = new StringBuffer("Count = "); sb.append(count); sb.append(" of "); sb.append(total); sb.append("."); String msg = sb.toString(); 

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

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

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

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

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

ओह, और डेटाबेस आरेख नरक से उत्परिवर्ती मकड़ी की तरह दिखता था

कैसे POBI के बारे में स्पष्ट रूप से इरादे से निराशा?

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

आलोचना की अक्षम प्रकृति के कारण (वह एक सीईओ थे, एक आईटी आदमी नहीं था), मेरे कॉलेग्यू ने इसे सही तरीके से हासिल नहीं किया। यदि आपके पास कोई प्रदर्शन समस्या नहीं है, तो आप इसे समाप्त नहीं कर सकते …

एक रिलीज तक, उन्होंने नए कोड में बहुत से विलंब (200) फ़ंक्शन कॉल्स (यह डेल्फी था) डाल दिया। यह लाइव-लाइव होने के बाद सिर्फ 20 मिनट लगे, और उन्हें सीईओ के दफ्तर में उपस्थित होने का आदेश दिया गया ताकि वह व्यक्ति में अपने अतिदेख़ अपमान को उखाड़ सकें।

जब तक वह वापस लौट आये, मुस्कुराते हुए, मजाक कर रहा था, या बिगएमएक के लिए बाहर निकल रहा था, जब तक वह आम तौर पर सीईओ और कंपनी के बारे में तालियां लातें, और बाकी दिन बिताने के लिए मौत की कमी ।

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

यह पहला (और केवल) समय था जो कि बुराई के सीईओ ने कहा "महान काम!" उसे। यह सब मायने रखता है, सही है?

यह असली POBI था

लेकिन यह एक सामाजिक प्रक्रिया अनुकूलन भी है, इसलिए यह 100% ठीक है।

मुझे लगता है।

"डेटाबेस स्वतंत्रता" इसका मतलब था कोई संग्रहीत procs, triggers, आदि – कोई भी विदेशी कुंजी भी नहीं

 var stringBuilder = new StringBuilder(); stringBuilder.Append(myObj.a + myObj.b + myObj.c + myObj.d); string cat = stringBuilder.ToString(); 

मैंने कभी देखा है एक StringBuilder का सबसे अच्छा उपयोग

एक स्ट्रिंग विभाजित करने के लिए एक regex का उपयोग करना, जब एक सरल स्ट्रिंग .Split suffices

किसी ने सॉर्टिंग का उल्लेख नहीं किया है, इसलिए मैं

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

मुझे पता है कि यह धागा बहुत देर हो चुकी है, लेकिन मैंने हाल ही में यह देखा था:

 bool isFinished = GetIsFinished(); switch (isFinished) { case true: DoFinish(); break; case false: DoNextStep(); break; default: DoNextStep(); } 

Y'know, बस के मामले में एक बूलियन कुछ अतिरिक्त मूल्य था …

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

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

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

मैंने एक बार एक ऐसे एप पर काम किया था जो इस तरह से कोड से भरा था:

  1 tuple *FindTuple( DataSet *set, int target ) { 2 tuple *found = null; 3 tuple *curr = GetFirstTupleOfSet(set); 4 while (curr) { 5 if (curr->id == target) 6 found = curr; 7 curr = GetNextTuple(curr); 8 } 9 return found; 10 } 

बस को निकाला जा रहा found , अंत में null लौट रहा है, और छठे पंक्ति को बदलता है:

  return curr; 

ऐप के प्रदर्शन को दोगुना

मैं एक बार कोड को संशोधित करने की कोशिश कर रहा था जिसमें ये रत्न स्थिरांक वर्ग में शामिल था

 public static String COMMA_DELIMINATOR=","; public static String COMMA_SPACE_DELIMINATOR=", "; public static String COLIN_DELIMINATOR=":"; 

इनमें से प्रत्येक का इस्तेमाल विभिन्न प्रयोजनों के लिए आवेदन के बाकी हिस्सों में कई बार किया गया था। COMMA_DELIMINATOR ने 8 अलग-अलग पैकेजों में 200 से अधिक उपयोगों के साथ कोड बिछाया।

बड़ी संख्या में सबसे बड़ी संख्या, जिसे मैं समय और समय में इनहाउस सॉफ़्टवेयर में फिर से चलाता हूं:

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

मेरी बातों को समझो। किसी भी घर के काम के लिए: यह नहीं होगा!

मेरे पास एक सहकर्मी था जो हमारे सी संकलक ऑप्टिमाइज़र और दिनचर्या पुनर्रचना कोड को बाहर निकालने की कोशिश कर रहा था जो केवल वह पढ़ सकता था। उनकी पसंदीदा चालें में से एक एक पठनीय विधि (कुछ कोड बनाने) की तरह बदल रहा था:

 int some_method(int input1, int input2) { int x; if (input1 == -1) { return 0; } if (input1 == input2) { return input1; } ... a long expression here ... return x; } 

इस मामले में:

 int some_method() { return (input == -1) ? 0 : (input1 == input2) ? input 1 : ... a long expression ... ... a long expression ... ... a long expression ... } 

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

इसके बाद, उसके बाद, किसी कारण के लिए उन्होंने तय किया कि ptr->structElement बहुत अपठनीय था, इसलिए उन्होंने इन सभी को (*ptr).structElement में बदलना शुरू कर दिया। सिद्धांत पर (*ptr).structElement को (*ptr).structElement कि यह और अधिक पठनीय और तेज भी था।

पढ़ने योग्य कोड को 1% सुधार के लिए अपठनीय कोड में बदलना, और कभी-कभी वास्तव में धीमा कोड।

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

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

इसलिए इसे ठीक करने के लिए, मैंने मल्टी-थ्रेडिंग घटकों को हटा दिया और I / O साफ किया अन्य परिवर्तनों के साथ, 150-स्रोत डाटासेट पर निष्पादन का समय मेरी मशीन पर 10 मिनट से नीचे गिरा, और औसत कंपनी मशीन पर आधे से लेकर एक घंटे तक चला गया।

मुझे लगता है कि मैं इस मणि की पेशकश कर सकता हूं:

 unsigned long isqrt(unsigned long value) { unsigned long tmp = 1, root = 0; #define ISQRT_INNER(shift) \ { \ if (value >= (tmp = ((root << 1) + (1 << (shift))) << (shift))) \ { \ root += 1 << shift; \ value -= tmp; \ } \ } // Find out how many bytes our value uses // so we don't do any uneeded work. if (value & 0xffff0000) { if ((value & 0xff000000) == 0) tmp = 3; else tmp = 4; } else if (value & 0x0000ff00) tmp = 2; switch (tmp) { case 4: ISQRT_INNER(15); ISQRT_INNER(14); ISQRT_INNER(13); ISQRT_INNER(12); case 3: ISQRT_INNER(11); ISQRT_INNER(10); ISQRT_INNER( 9); ISQRT_INNER( 8); case 2: ISQRT_INNER( 7); ISQRT_INNER( 6); ISQRT_INNER( 5); ISQRT_INNER( 4); case 1: ISQRT_INNER( 3); ISQRT_INNER( 2); ISQRT_INNER( 1); ISQRT_INNER( 0); } #undef ISQRT_INNER return root; } 

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

 unsigned long isqrt(unsigned long value) { unsigned long tmp = 1, root = 0; #define ISQRT_INNER(shift) \ { \ if (value >= (tmp = ((root << 1) + (1 << (shift))) << (shift))) \ { \ root += 1 << shift; \ value -= tmp; \ } \ } ISQRT_INNER (15); ISQRT_INNER (14); ISQRT_INNER (13); ISQRT_INNER (12); ISQRT_INNER (11); ISQRT_INNER (10); ISQRT_INNER ( 9); ISQRT_INNER ( 8); ISQRT_INNER ( 7); ISQRT_INNER ( 6); ISQRT_INNER ( 5); ISQRT_INNER ( 4); ISQRT_INNER ( 3); ISQRT_INNER ( 2); ISQRT_INNER ( 1); ISQRT_INNER ( 0); #undef ISQRT_INNER return root; } 

बेशक ऐसा करने के लिए दोनों तेजी से और बेहतर तरीके हैं, लेकिन मुझे लगता है कि यह एक निराशा का उत्कृष्ट उदाहरण है।

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

 unsigned long isqrt(unsigned long value) { unsigned long tmp = 1 << 30, root = 0; while (tmp != 0) { if (value >= root + tmp) { value -= root + tmp; root += tmp << 1; } root >>= 1; tmp >>= 2; } return root; } 

यह बिल्कुल एक ही एल्गोरिदम है, यद्यपि थोड़ा अलग कार्यान्वयन, तो मुझे लगता है कि यह योग्य है।

यह एक उच्च स्तर पर हो सकता है कि आप उसके बाद क्या कर रहे थे, लेकिन इसे ठीक करने के लिए (यदि आपको अनुमति है) भी एक उच्च स्तर का दर्द शामिल है:

एक स्थापित, परीक्षण, परिपक्व पुस्तकालयों में से एक का उपयोग करने के बजाय ऑब्जेक्ट रिलेशनशिप प्रबंधक / डेटा एक्सेस लेयर को रोल करने पर हाथ डालते हुए (यहां तक ​​कि उन्हें आपके पास बताया जाने के बावजूद)

सभी विदेशी कुंजी बाधाओं को एक डेटाबेस से हटा दिया गया था, क्योंकि अन्यथा कई त्रुटियां होती हैं

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

हर जावास्क्रिप्ट ऑपरेशन से पहले जांच कर रहा है कि क्या आप मौजूद ऑब्जेक्ट पर काम कर रहे हैं।

 if (myObj) { //or its evil cousin, if (myObj != null) { label.text = myObj.value; // we know label exists because it has already been // checked in a big if block somewhere at the top } 

इस प्रकार के कोड के साथ मेरी समस्या कोई भी ध्यान नहीं रखता है अगर यह अस्तित्व में नहीं है? बस कुछ भी नहीं है? उपयोगकर्ता को प्रतिक्रिया न दें?

मैं मानता हूं कि Object expected त्रुटियां कष्टप्रद हैं, लेकिन यह उसके लिए सबसे अच्छा समाधान नहीं है।

कैसे YAGNI चरमपंथ के बारे में यह समयपूर्व निराशा का एक रूप है। ऐसा लगता है कि जब भी आप YAGNI को लागू करते हैं, तो आप इसे ज़रूरत से समाप्त कर देते हैं, जिसके परिणामस्वरूप 10 गुना इसे जोड़ने के प्रयास से अगर आपने इसे शुरुआत में जोड़ा था यदि आप एक सफल कार्यक्रम बनाते हैं तो आप की आवश्यकता के लिए बाधाएं हैं I यदि आप उन कार्यक्रमों का निर्माण करने के लिए उपयोग किए गए हैं जिनके जीवन में शीघ्रता से रन निकल जाते हैं तो YAGNI अभ्यास करना जारी रखता है क्योंकि तब मुझे लगता है YAGNI

ठीक समय से पहले अनुकूलन नहीं – लेकिन निश्चित रूप से गुमराह किया – यह विंडोज 7 पर चर्चा करते हुए एक लेख से बीबीसी वेबसाइट पर पढ़ा गया था।

श्री कर्रान ने कहा कि माइक्रोसॉफ्ट विंडोज टीम ऑपरेटिंग सिस्टम के हर पहलू को सुधारने के लिए तैयार कर रही थी। "हम WAV फ़ाइल शटडाउन संगीत को थोडा ट्रिम करके शटडाउन समय से 400 मिलिसेकंड को दाढ़ी में सक्षम थे।

अब, मैंने अभी तक विंडोज 7 की कोशिश नहीं की है, इसलिए मैं गलत हो सकता है, लेकिन मैं यह शर्त लगाने के लिए तैयार हूं कि इसमें अन्य समस्याएं हैं जो बंद करने के लिए कितने समय लगेगा सब के बाद, एक बार जब मैं 'शट डाउन विंडो' संदेश देखता हूं, मॉनिटर बंद हो जाता है और मैं दूर चल रहा हूं – यह कैसे 400 मिलीसेकेंड मुझे फायदा पहुँचाता है?

मेरे विभाग में किसी ने एक बार स्ट्रिंग क्लास लिखा था। CString जैसी एक इंटरफ़ेस, लेकिन विंडोज निर्भरता के बिना।

एक "ऑप्टिमाइज़ेशन" वे किया था जो आवश्यक से अधिक स्मृति आवंटित नहीं करना था जाहिर तौर पर यह महसूस नहीं किया जा रहा है कि std::string जैसे कारण वर्गों को अतिरिक्त स्मृति आवंटित करना इतना है कि += ऑपरेशन्स का एक क्रम ओ (एन) समय में चलाया जा सकता है।

इसके बजाय, प्रत्येक एकल += कॉल ने एक पुन: आवर्तन को मजबूर किया, जो दो बार अनुलग्नक को ओ ( एन² ) स्केलिएल के पेंटर के एल्गोरिदम में बदल गया ।

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

No offense to anyone, but I just graded an assignment (java) that had this

 import java.lang.*;