आपके द्वारा देखा गया सबसे हास्यास्पद निराशावाद क्या है? [बन्द है]


145

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


21
"निराशावाद" एक महान शब्द है।
mqp

बस अगर आपको पता नहीं था, तो उन्होंने नवीनतम पॉडकास्ट के बारे में यहां आपके धागे के बारे में बात की।
mmcdole

जवाबों:


81

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

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

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

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


16
अरे आपने अपना गणित कहाँ से सीखा? 1 कैश / रैम एक्सेस के साथ 2 निर्देश स्पष्ट रूप से 1 कैश / रैम एक्सेस के साथ 1 निर्देश की तुलना में तेज़ है!
रेजर तूफान

2
@ रेजरस्टॉर्म बाद की मशीनों पर जहां बैंडविड्थ और कैश अधिक कीमती हैं, इसके विपरीत सच होगा। बिटमास्क / शिफ्ट सस्ता है, लेकिन आप जितना संभव हो उतना कैश में फिट होना चाहते हैं और बैंडविड्थ को भी कम करते हैं।
जेड

206

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

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

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

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

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

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


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

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

5
यह वास्तव में व्यक्तिगत मामले पर निर्भर करता है, ऐसे कई मामले हैं जहां समय से पहले अनुकूलन एक समस्या बन जाता है, अपर्याप्त अनुकूलन योजना से एक समस्या बन जाती है
मार्क रोजर्स

12
-1: "अनुकूलन" और उचित डिजाइन के बीच अंतर है। जो लोग नहीं बता सकते हैं, उनके लिए अंगूठे का एक अच्छा नियम यह है कि एक "अनुकूलन" कोड को पढ़ने में कठिन बनाता है, लेकिन तेज या अधिक कुशल। एक बेहतर डिज़ाइन कोड को पढ़ने में आसान बना देगा (या कम से कम कोई बदतर नहीं) और अधिक कुशल।
TED

5
यदि यह अत्यधिक उपयोग किया जाता है, तो एसओ पर सवाल पूछने वाली आबादी आउटलेर्स की ओर भारी होती है। : D
dkretz

114

डेटाबेस निराशावादी प्लेलैंड हैं।

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

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

वह मेरे सिर के ऊपर से है।


सूचकांक की आवश्यकता का विरोध करना केवल सोचने के लिए दर्दनाक है।
छिपकली

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

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

3
मैं जोड़ता हूं: डेटाबेस को कई अलग-अलग डेटाबेसों में विभाजित करता हूं (ग्राहक एसी, ग्राहक डीएफ, आदि)
गैब्रियल डी एटनन

क्या आप "फ़ील्ड्स-ए-ए-सरणी में असामान्य रूप से" पर विस्तार से बता सकते हैं? आपका यहां क्या मतलब है?
बार्ट वैन ह्युकेलोम

87

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

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

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

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


37
मैं सहमत हूँ कि "सीपीयू / डिस्क स्पेस / मेमोरी सस्ती है" सभी बुराई की असली जड़ है। +1
ksuralta

5
मैंने सुना है कि XML ड्राइवल भी। एक और टैंक वाली कंपनी।
n8wrl

19
@ अक्षलता: "सीपीयू / डिस्क स्पेस / मेमोरी सस्ती है" विचार से बचने के लिए एक सुविधाजनक बहाना है। विचार से बचना सभी बुराई की काल्पनिक जड़ है।
पिस्कोर ने बिल्डिंग

यह XMLization मेरे कार्यस्थल पर भी हुआ, इसके बाद JSONization भी हुआ। सभी कुछ "श्रमसाध्य" संबंधपरक डेटाबेस डिजाइन से बचने के लिए।
तंज87

75

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

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

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

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

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

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

उसे: सलाहकार ने कहा कि जिस तरह से एक तालिका में कई कॉलम हैं।

Me: और यह प्रदर्शन को प्रभावित कर रहा है?

उसे: हाँ, उपयोगकर्ताओं ने अनुप्रयोग के XYZ मॉड्यूल में रुक-रुक कर मंदी की सूचना दी है।

मैं: आपको कैसे पता चलेगा कि टेबल की चौड़ाई समस्या का स्रोत है?

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

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

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

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

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

मैं: उह हह। तो डेटाबेस री-डिज़ाइन सेवाओं को बेचने वाले सलाहकार को लगता है कि हमें डेटाबेस री-डिज़ाइन की आवश्यकता है ...।

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

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

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


आगा MSAccess ठेस करने के लिए। हमने सभी एक्सेस कनेक्शन को छोड़ने के लिए एक प्रक्रिया लिखी थी जो हर कुछ मिनटों के बाद अंत में संदेश में आ गई कि यह खराब है।
नेट

1
हमारे पास एक समान काम था, लेकिन यह विवाद में चला गया था। निष्पक्ष होने के लिए, प्रवेश समस्या नहीं है, यह सिर्फ neophytes के लिए nonperformanct क्वेरी बनाने / चलाने के लिए आसान बनाता है।
जॉन एफएक्स

हम उत्पादन DB के लिए विरासत तदर्थ प्रवेश कनेक्शन पर हमारी कंपनी पर निर्भरता है। कुछ आकस्मिक SQL'ers की तरह कुछ भी नहीं है, जहां एक क्लॉज को भूल जाओ और मुख्य तालिकाओं को गति दें!
हार्डकोड

35
"मैंने सुना है कि
मौवे

यह और बुरा हो सकता था। उपयोग करते समय एक्सेल क्वेरी संपादक पूर्ण डेटाबेस को लॉक कर देता है। जब मुझे इसके बारे में पता नहीं था, तो मैंने इसके एक उदाहरण को दिन के बेहतर हिस्से के लिए खुला छोड़ दिया, जबकि मैंने कुछ और काम किया। सबसे बुरी बात यह है कि एमएस SQL ​​सर्वर ने सही उपयोगकर्ता नाम / मशीन की रिपोर्ट नहीं की जो ताला बना रही थी। मुझे घंटों बाद एहसास हुआ कि टेबल लॉक होने के कारण मैं लॉकिंग का कारण बन गया था क्योंकि मैं जिस दृश्य को देख रहा था उसका हिस्सा बंद था और पहले सब कुछ जाँच रहा था।
एस्टेबन कुबेर

58

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

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


10
हो सकता है कि वे फ्लक्स कैपेसिटर
मिकाज़

6
इसलिए, मूल रूप से शामिल केवल नया सिद्धांत कंडक्टर और फ्लक्स के सापेक्ष गति से उत्पन्न होने वाली शक्ति के बजाय है, जो मैग्नेटो अनिच्छा और कैपेसिटिव ड्यूरेक्टेंस की मामूली बातचीत द्वारा उत्पादित है?
मैट रोजिश

17
+1 क्योंकि मेरे मॉनिटर को किसी भी तरह से सफाई की आवश्यकता थी ;-)
RBerteig

1
अरे नहीं!! लेकिन इकोलोमैगेंटिक-क्रॉस-जेनेटिक प्रभाव के बारे में क्या। मुझे लगता है कि इसे भी ध्यान में रखा जाना चाहिए। या विषय एक ज़ोंबी में बदल सकता है।
सूरज चंद्रन

1
तीन शब्द: "क्रोम मफलर बियरिंग्स।"
ऑलबीट

53

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

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();

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

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

3
पहला: आप कम से कम जावा 5 का उपयोग क्यों नहीं करेंगे? दूसरा: हाँ आप कर सकते हैं। यह कैसा है कि आप पहले उदाहरण में 5 तक गिनती कर सकते हैं, लेकिन दूसरी नहीं? यह पहले के समान स्ट्रिंग शाब्दिक का उपयोग करता है। पठनीय कोड लिखें और संकलक को यह तय करने दें कि पर्दे के पीछे स्ट्रिंगर का उपयोग कब करना है।
छिपकली

4
@ MetroidFan2002: दूसरे उदाहरण में स्ट्रिंग शाब्दिक भी वस्तुएं हैं। जैसा कि मैंने उत्तर में कहा था, अंतर इस पैमाने पर तुच्छ हैं।
छिपकली

1
इसका मतलब यह नहीं है कि यह प्रत्येक स्ट्रिंग को अपने स्ट्रिंगर के साथ बदल देता है। कंपाइलर जो ऑप्टिमाइज़ेशन करता है वह निर्मित वस्तुओं की संख्या को कम करता है।
छिपकली

3
@Eric: स्ट्रिंग संदेश = "+ कुल +" की "गिनती =" + गिनती + ";" अक्सर जावा में स्ट्रिंग स्ट्रिंग = नया स्ट्रिंगरफ़र () के लिए संकलित किया जाता है। एपेंड ("काउंट")। ... जो ठीक है कि दूसरा उदाहरण क्या है।
ग्रांट वैग्नर

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

47

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

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

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

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


42

कैसे के बारे में POBI - निराशा द्वारा जाहिर इरादे?

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

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

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

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

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

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

यह असली POBI था।

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

मुझे लगता है।


10
मुझे याद है कि कोई व्यक्ति डेटा प्रोसेसिंग ऐप के बारे में लिख रहा है जो विभिन्न स्तरों पर बेचा गया था जहां "लाइट" प्रति सेकंड केवल कुछ डेटा सेट, "सुपरडुपर" संस्करण हजारों को क्रुच कर सकता है। स्लीप (N) के होने का एकमात्र स्रोत कोड अंतर है।
पीटरचेन

1
प्रतिभाशाली! मैं उस तरह की स्थिति में उस मानक की सिफारिश करेंगे। विकास की शुरुआत में स्मृति का एक बड़ा हिस्सा आवंटित करें और कुछ नींद कॉल जोड़ें, और जब भी आपको कुछ प्रदर्शन करने की आवश्यकता होती है, तो बस उन्हें नीचे झुकाएं। इसे एक चमत्कार कार्यकर्ता कहा जाता है;)
RCIX

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

32

"डेटाबेस स्वतंत्रता"। इसका मतलब कोई संग्रहीत प्रोक्स, ट्रिगर्स, आदि नहीं है - यहां तक ​​कि किसी भी विदेशी कुंजी नहीं।


8
क्या यह "स्वतंत्रता" इस अर्थ में है कि आप डेटाबेस से बहुत ऊपर हैं, आप भूल गए हैं कि डेटा क्या है? अनावश्यक रूप से डेटाबेस पर अमूर्त "प्रवासन से बचने के लिए दर्द" एक पालतू जानवर है; आपको इसकी आवश्यकता नहीं है।
रॉब

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

5
मुझे यकीन है कि ऐसा होता है, लेकिन यह काफी दुर्लभ है कि आप एक बेवकूफ हैं यदि आप अपनी वास्तुकला को उस संभावना के आसपास डिजाइन करते हैं।
चिरई।

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

3
@ सभी: DB स्वतंत्रता आपको खर्च कर सकती है, हां, लेकिन हमारा उत्पाद उन वातावरणों में चलाया जाता है जहां DB विक्रेता बोलियों द्वारा चुना जाता है, और हमें मूल रूप से साथ खेलना होगा। कुछ डेवलपर्स को लंबवत-एकीकृत सॉफ़्टवेयर स्टैक की विलासिता नहीं मिलती है और इसके बावजूद उसे करना पड़ता है।
क्रिस आर

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

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


9
"अवधारणा पर अस्पष्ट" के बारे में बात करें! वाह!
एडी

3
ठंडा। "मेरी लीड कहती है कि मुझे स्ट्रिंगबर्ल क्लास का उपयोग करना है अगर मैं स्ट्रिंग्स को बदलना चाहता हूं। यही मैं करता हूं। तो क्या गलत है?" लोल ...
TheBlastOne

26

एक स्ट्रिंग को विभाजित करने के लिए एक रेगेक्स का उपयोग करना जब एक साधारण स्ट्रिंग। एसपीएलआईटी पर्याप्त होता है


25
जावा स्ट्रिंग में BUT.Split एक regex का उपयोग करता है!
फ्रैंक क्रुएगर

मैं यह नहीं देखता कि रेगेक्स एक आंतरिक स्ट्रिंग विभाजन के रूप में कितनी तेजी से हो सकता है।
आंद्रेई रैनिया

2
लेकिन स्ट्रिंग बंटवारे के लिए इस्तेमाल किए गए एक रेगेक्स को जानबूझकर शिकार करना और इसे 'सरल' विभाजन फ़ंक्शन के साथ बदलने से निराशावाद का एक आदर्श उदाहरण लगता है। रेगेक्स लाइब्रेरी काफी तेज हैं।
डेविड क्रॉशव

5
@ डेविड क्रॉशव: माइक्रो-ऑप्टिमाइज़ेशन के अवसरों को कम करने से मानव समय बर्बाद होता है; कली जब कोड लिखते हैं , तो कम से कम जटिल पर्याप्त समाधान का उपयोग करें।
पिस्कोवर ने

6
-1: यदि आपको रिजेक्स करने के लिए उपयोग किया जाता है, तो 1001 भाषा-आंतरिक आंतरिक मैनिपुलेटर्स के उपयोग के बजाय इसे लिखना बहुत स्वाभाविक है।
किलियनड्स

26

इस सूत्र को बहुत देर से मुझे पता है, लेकिन मैंने हाल ही में यह देखा:

bool isFinished = GetIsFinished();

switch (isFinished)
{
    case true:
        DoFinish();
        break;

    case false:
        DoNextStep();
        break;

    default:
        DoNextStep();
}

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


22
यह सच है, एक फाइलनॉटफ़ाउंड ऑफ़कोर्स गलत
Ikke

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

1
@ ओरांग ... वैसे भी स्विच के रूप में आपके पास क्यों होगा? यह एक बूलियन है - यदि कोई और है / तो वह सब आवश्यक है।
दामोविसा

@Damovisa facepalm सही है ... बहुत अच्छी तरह से तो :) छूटी कि :)
Oorang

2
यह अशक्त था <boolean> ... :)
जॉर्ज चखिद्ज़े

25

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

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

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


28
उनके बेहतरीन प्रबंधन - "नहीं, चलो इस ऐप को ठीक करने में 80-प्रोग्रामर घंटों को बंद नहीं करते हैं, यह बहुत महंगा है। आइए बस इसे बनाए रखें, ताकि इसके कीड़े प्रति माह 200+ उपयोगकर्ता घंटे, प्लस 10 प्रोग्रामर घंटे एक महीने के लिए निकल सकें। 'रखरखाव'।" AAAAAAAAAUGH !!!
पिस्कोर ने बिल्डिंग

25

ऐसा लगता है कि किसी ने छँटाई का उल्लेख नहीं किया है, इसलिए मैं करूँगा।

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


2
मैंने खुद एक बार ऐसा किया, जब मैंने यह निर्धारित किया कि आमतौर पर n = 2। बाद में उत्पाद संवर्द्धन ने मेरे आधार को अमान्य कर दिया और कोड को PDQ बदल दिया गया।
मार्क रैनसम

2
हाँ, लेकिन यह कुछ लिखने के लिए अच्छा है algorythm ); आधार पर हर अब एक तो
UpTheCreek

20

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

 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;

एप्लिकेशन प्रदर्शन दोगुना कर दिया।


1
मैंने एक बार एक कंपनी में काम किया था जहां कोडिंग दिशानिर्देशों ने "अंत में सिर्फ एक रिटर्न" (रखरखाव के लिए) की मांग की थी। और वास्तव में आपकी तरह कुछ थूक कोड, क्योंकि उन्हें नहीं लगता (स्पष्ट समाधान अधिकांश बार गोटो का उपयोग कर खरीद से बाहर निकलने, या छोरों की निकास स्थिति को बदलने के लिए किया गया था)
flolo

12
यहाँ एक वापसी वक्र विशेष रूप से अलग व्यवहार पैदा करता है। जब आप वापस लौटते हैं तो आप एफआईआरएसटी मैच प्राप्त करते हैं, जहां आपके द्वारा चिपकाए गए कोड के रूप में लास्ट मैच लौटाता है।
सोपबॉक्स

2
@ सोपबॉक्स: आप सही हैं। @ डोर हाई आर्क: प्रदर्शन में वृद्धि का एकल रिटर्न नियम से कोई लेना-देना नहीं था, क्योंकि फ्लो ने कहा था कि लूप की स्थिति का पीछा करते हुए (करण और पाया) का समान प्रभाव होगा। GOTO से खरीद निकास भयानक है, और सिंगल रिटर्न गाइडलाइन के उद्देश्य को हरा देता है।
अकुसेटे

2
सभी को अच्छी टिप्पणियाँ। इस मामले में प्रत्येक आईडी के साथ केवल एक टपल होना चाहिए था।
हाई आर्क

7
हालांकि यह "निराशावाद" नहीं है, क्या यह है? यह बस एक अनुकूलन होने की प्रतीक्षा कर रहा है।
टिम लांग

20

मुझे एक बार कोड को संशोधित करने का प्रयास करना पड़ा जिसमें इन रत्नों को कॉन्स्टेंट्स वर्ग में शामिल किया गया था

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

इनमें से प्रत्येक का उपयोग विभिन्न प्रयोजनों के लिए शेष एप्लिकेशन में कई बार किया गया था। COMMA_DELIMINATOR ने 8 विभिन्न पैकेजों में 200 से अधिक उपयोगों के साथ कोड को लिट किया।


कम से कम ऐसा कुछ है जो स्रोत से बाहर निकालना / बदलना आसान है - फिर भी, मेरी सहानुभूति।
एरिक फोर्ब्स

12
इसके अलावा - अपराधी? मुझे लगा कि यह 'सीमांत' वर्तनी है। अपराधी 90 के दशक की एक बुरी फिल्म की तरह लगता है, जिसे किसी तरह 3 सीक्वेल मिल गए ...........
एरिक फोर्ब्स

53
Deliminator III: राइज़ ऑफ़ द कॉमस
रोब

33
एक और नोट पर, मैं कोलिन्स के उचित परिसीमन को देखकर प्रसन्न हूं। अपने नमक के लायक हर प्रोग्रामर जानता है कि अगर कोई एक चीज है जिसे आप बिल्कुल ठीक से अलग करना चाहते हैं, तो यह लानत है।
रॉब

2
यह उचित खोज और प्रतिस्थापित करना आसान नहीं है। चूंकि प्रत्येक का उपयोग विभिन्न उद्देश्यों के लिए किया जाता है। किसी भी अच्छे प्रोग्रामर ने कम से कम ऐसा कुछ किया होगा: COUNTRY_LIST_DELIM = ... CLASSIFICATION_DELIM = ... आदि
KitsuneYMG

19

बड़े सभी समय नंबर एक जिसे मैं समय और समय के साथ फिर से इनडोर सॉफ्टवेयर में चलाता हूं:

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

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


9
होता ही है। MySQL -> postgresql, इसलिए हमने कुछ भी नहीं खोया
थॉमस

या पोस्टग्रिज / पोस्टगिस -> साइक्लाइट / स्थानिक ... कि गधे में दर्द था ...
फिलिप

यह JUnit परीक्षणों में होता है
kachanov 1

17

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

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को इस सिद्धांत पर बदलना शुरू कर दिया कि यह अधिक पठनीय और तेज भी था।

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


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

2
@ मिचेल: मैं तब तक नहीं करूंगा, जब तक कि यह संकेत न दें कि यह तेज था , न कि सिर्फ छोटा
dsimcha

ज्यादातर स्थितियों में टर्नरी ऑपरेटर की तुलना में अधिक पठनीय है if। सी में अभिव्यक्तियों पर बयानों पर जोर देना सांस्कृतिक / धार्मिक हठधर्मिता है, न कि किसी प्रकार का वस्तुनिष्ठ अभ्यास। (बेहतर दिशानिर्देश: यदि नेस्टेड टर्नरी पढ़ने के लिए बहुत लंबा है, तो आपको ifया तो उपयोग नहीं करना चाहिए ।)
लेउशेंको

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

15

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

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

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


मैं सिर्फ आज एक परियोजना में ऐसा होने से रोकता हूं। अब मुझे पता है कि मैंने अच्छा विकल्प बनाया है।
deadalnix

14

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

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;
}

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

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;
}

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


मुझे लगता है कि isqrt()गणना करता है floor(sqrt()), लेकिन, यह कोड क्यों काम करता है?
पाब्लो एच।

11

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

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


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

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

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

4
यदि आपके पास कोई भी महत्वपूर्ण विशेषता नहीं है, तो हाथ से लुढ़कना वास्तव में आपका एकमात्र विकल्प है।
स्टेटिक्सन

3
दरअसल, ऊपर कुछ टिप्पणियों को देखते हुए, कुछ और परिप्रेक्ष्य: एक और निराशा की कोशिश है और ओआरएम प्राप्त करने के लिए बिल्कुल सब कुछ करना है। अक्सर 95% + मामलों के लिए उपयोगी है। उस अंतिम 5% के लिए यह बहुत आसान है कि प्रदर्शन, सरलता या दोनों के लिए हाथ से तैयार की गई दृढ़ता कोड / डायरेक्ट स्टोर की गई प्रक्रिया कॉल आदि को छोड़ दिया जाए।
गॉर्डन हार्टले

10

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


8

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


8

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

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त्रुटियां कष्टप्रद हैं, लेकिन यह उसके लिए सबसे अच्छा समाधान नहीं है।


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

7

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


3
धन्यवाद, मैं इन लंगड़ा 'चरम प्रोग्रामिंग' योगों से बीमार हूं और लोग आलसी, प्रति-उत्पादक प्रथाओं का समर्थन करने के लिए उनका उपयोग कैसे करते हैं।
JAL

वास्तविक परियोजनाओं के अध्ययन से पता चलता है कि एक बार और फिर से 3 कोड के बीच का वास्तविक कारक औसत 3 है। तो 10 केवल "महसूस" मूल्य है, लेकिन आपके इरादे सही हैं।
पीटरचेन

@peterchen - क्या आप कह रहे हैं कि अध्ययन से पता चलता है कि पुन: प्रयोज्य कोड को एक-कोड कोड के रूप में लिखने में तीन बार लगता है, या यह कि वे यह दिखाते हैं कि एक-कोड को पुन: प्रयोज्य कोड में बदलने के लिए तीन बार लगते हैं, जितना कि इसे लिखने के लिए पहली जगह में पुन: प्रयोज्य कोड?
जेफ सनातन जुएल

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

6

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

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

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


आप शायद पाएंगे कि बीबीसी की वेबसाइट पर गैर-प्रोग्रामर को समझाने के लिए अन्य मुद्दे उतने आसान नहीं हैं।
टॉम लेयस

अब यह एक ऐसा कोण है जिस पर मैंने विचार नहीं किया है - शायद मैं अपना
निंदकत्व

यह 400 एमएस पावर ड्रा का 400 एमएस है। शायद नगण्य है, लेकिन शायद यह समय के साथ बढ़ता है। फिर भी, कुछ ऐसा नहीं है जिसके बारे में मुझे चिंता होगी।
ZachS

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

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

6

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

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

इसके बजाय, हर एक +=कॉल ने एक वास्तविककरण को मजबूर कर दिया, जो बार-बार एक O (n Sch ) शलेमियल द पेंटर के एल्गोरिदम में बदल गया


5

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


3
यह एक समय से पहले का अनुकूलन नहीं है, उसने सोचा कि उसे सही करने के लिए ऐसा करने की आवश्यकता है
प्योरोलॉजिकल

निश्चित रूप से, उन्होंने सोचा कि उन्हें इसकी आवश्यकता है, लेकिन चूंकि अधिकांश DBMSes में किसी प्रकार का DAYOFWEEK (टाइमस्टैम्प) फ़ंक्शन होता है, इसलिए यह करना कि मेरे विचार में गड़बड़ अप-फ्रंट पर्याप्त है :)
Joril

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

वैसे मुझे नहीं पता कि इतनी पंक्तियाँ थीं, लेकिन निश्चित रूप से यह स्पष्टीकरण नहीं है जो दिया गया था :)
Joril

3

किसी के लिए कोई अपराध नहीं है, लेकिन मैंने सिर्फ एक असाइनमेंट (जावा) को वर्गीकृत किया है जो यह था

import java.lang.*;

1
जब तक यह एक ऊपरी स्तर की कक्षा नहीं है, मुझे लगता है कि आपको इस छात्र को थोड़ा सुस्त काटने की आवश्यकता है जब तक कि आपने उसे यह जानने के लिए पर्याप्त नहीं सिखाया कि यह एक अच्छा विचार क्यों नहीं है।
ब्रायन ओकले

24
क्या मैं एक छात्र के कोड पर डब्ल्यूटीएफ को कॉल करने वाले शिक्षक की विडंबना को नोट करने वाला केवल एक ही होने जा रहा हूं कि वह / वह सही ढंग से कार्यक्रम सिखाने के लिए जिम्मेदार है?
जॉन एफएक्स

3
हाँ, मैं यह नहीं देख सकता कि इससे चोट लगेगी। कम से कम यह अतिशयोक्तिपूर्ण है। छात्रों को सीखने के दौरान कठोर स्थिरता का सहारा लेना पड़ता है, और java.lang का आयात करना छात्र के आयात के बारे में जो सीखा है, उसके अनुरूप है।
सायगिल

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

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