इतने सारे डेवलपर्स प्रदर्शन, पठनीयता और रखरखाव पर विश्वास क्यों नहीं करते?


34

इस सवाल का जवाब देते समय , मुझे आश्चर्य हुआ कि क्यों इतने सारे डेवलपर्स का मानना ​​है कि एक अच्छे डिजाइन को प्रदर्शन के लिए जिम्मेदार नहीं होना चाहिए क्योंकि ऐसा करने से पठनीयता और / या रखरखाव प्रभावित होगा।

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

जबकि मैं स्वीकार करता हूं कि चरम मामले हैं, क्यों कई डेवलपर्स एक कुशल कार्यक्रम पर जोर देते हैं / डिजाइन के परिणामस्वरूप खराब पठनीयता और / या खराब रख-रखाव होगा, और परिणामस्वरूप प्रदर्शन एक डिजाइन विचार नहीं होना चाहिए?


9
बड़े पैमाने पर इसके बारे में तर्क करना लगभग असंभव होगा, लेकिन कोड के छोटे टुकड़ों के लिए यह काफी स्पष्ट है। बस पठनीय और कहे जाने वाले, के कुशल संस्करणों की तुलना करें।
एसके-तर्क

7
म्यू। आपको अपने बयान का समर्थन करके शुरू करना चाहिए कि कई डेवलपर्स जोर देकर कहते हैं कि दक्षता अचूकता की ओर ले जाती है।
पीटर टेलर

2
एसके-तर्क: मेरी राय में यह सभी स्टैटेक्सचेंज साइटों के सबसे अच्छे हिस्सों में से एक है, क्योंकि एक को स्पष्ट रूप से सवाल करने के लिए मिलता है, जो हर बार स्वस्थ हो सकता है। जो आपके लिए स्पष्ट हो सकता है वह किसी और के लिए स्पष्ट नहीं हो सकता है, और इसके विपरीत। :) साझा करना ही देखभाल है।
एंड्रियास जोहानसन 12

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

2
-1 सवाल के लिए। जब मैंने इसे पढ़ा तो मुझे लगा कि यह एकमात्र सच जवाब को बेदखल करने के लिए एक स्ट्रॉ आदमी है: "क्योंकि वे अजगर का उपयोग नहीं करते हैं।"
इंगो

जवाबों:


38

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

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


8
"जब कोई इस तरह के विचारों का मुकाबला करने की कोशिश करता है, तो इसमें गिरना आसान होता है - या कम से कम जैसे दिखता है - दूसरा चरम" मेरे पास हर समय लोगों के साथ यह सोचकर मुद्दे हैं कि मैं विपरीत दृश्य रखता हूं जब मैं पेशेवरों के साथ संतुलन बना रहा हूं। विपक्ष। सिर्फ प्रोग्रामिंग में ही नहीं, हर चीज में।
झॉकिंग

1
मैं इस बारे में चर्चा करने वाले हर किसी से इतना बीमार हूं कि मुझे गुस्सा आता है और चरम पर ले जाता हूं ..
थॉमस बोनीनी

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

मेरा जवाब ... अधिकांश डेवलपर्स अपनी नौकरियों में खराब हैं
TheCatWhisperer

38

उच्च-प्रदर्शन कोड पर काम करने वाले डेवलपर की ओर से आपके प्रश्न पर आते हैं, डिजाइन में विचार करने के लिए कई चीजें हैं।

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

सही हो जाओ, सुंदर हो जाओ, इसे जल्दी प्राप्त करो। उस क्रम में।


मुझे अंगूठे का नियम पसंद है: 'इसे सुंदर बनाओ, इसे तेजी से प्राप्त करो। उस क्रम में'। मैं उसका उपयोग शुरू करने जा रहा हूं।
मार्टिन यॉर्क

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

@KeithB - ​​आप एक अच्छा मुद्दा बनाते हैं, मैं इसे अपने जवाब में जोड़ दूंगा।
जॉरिस टिम्मरमन्स

+1: "इसे ठीक से प्राप्त करें, इसे सुंदर बनाएं, इसे तेज़ी से प्राप्त करें। उस क्रम में।" बहुत अच्छा सारांश, जिसके साथ मैं 90% सहमत हूं। कभी-कभी मैं सुंदर (और अधिक समझने योग्य) प्राप्त करने के बाद केवल कुछ कीड़े (इसे ठीक कर सकता हूं) को ठीक कर सकता हूं।
जियोर्जियो

+1 के लिए "समय से पहले निराशा न करें"। समय से पहले अनुकूलन से बचने के लिए सलाह देने की अनुमति नहीं है कि वे हड्डी के एल्गोरिदम को नियोजित करें। यदि आप जावा लिख ​​रहे हैं, और आपके पास एक संग्रह है जिसे आप containsबहुत अधिक कॉल करेंगे, तो ए का उपयोग करें HashSet, ए का नहीं ArrayList। प्रदर्शन मायने नहीं रख सकता है, लेकिन ऐसा कोई कारण नहीं है। अच्छे डिजाइन और प्रदर्शन के बीच शोषण को स्वीकार करें - यदि कुछ संग्रह को संसाधित करते हैं, तो एक ही पास में सब कुछ करने की कोशिश करें, जो शायद अधिक पठनीय और तेज (शायद) दोनों होगा।
टॉम एंडरसन

16

अगर मैं @ greengit के अच्छे चित्र को "उधार" लेने के लिए मान सकता हूं, और एक छोटा जोड़ बना सकता हूं:

|
P
E
R
F
O  *               X <- a program as first written
R   * 
M    *
A      *
N        *
C          *  *   *  *  *
E
|
O -- R E A D A B I L I T Y --

हम सभी को "सिखाया" गया है कि ट्रेडऑफ़ घटता है। इसके अलावा, हम सब मान लिया है हम इस तरह के इष्टतम प्रोग्रामर कि इतने तंग यह है किसी भी कार्यक्रम हम लिखने हैं वक्र पर । यदि कोई प्रोग्राम वक्र पर है, तो एक आयाम में कोई भी सुधार आवश्यक रूप से दूसरे आयाम में लागत को बढ़ाता है।

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


व्यक्तिगत रूप से मुझे लगता है कि वक्र का एक और छोर है जहां यह दाहिने हाथ की तरफ फिर से ऊपर जाता है (जब तक आप काफी दूर तक दाहिनी ओर चले जाते हैं (जिसका अर्थ है कि आपके एल्गोरिदम को फिर से सोचना)।
मार्टिन यॉर्क

2
+1 के लिए "अधिकांश कार्यक्रमों में सभी आयामों में सुधार के लिए बहुत जगह है।"
स्टीवन

5

सटीक रूप से क्योंकि अत्यधिक प्रदर्शन करने वाले सॉफ्टवेयर घटक आम तौर पर अन्य सॉफ्टवेयर घटकों (सभी अन्य चीजों के बराबर) की तुलना में अधिक जटिल होते हैं।

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

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

यह कहा जाने के साथ कि यह ध्यान दिया जाना चाहिए कि खराब प्रदर्शन करने वाला सॉफ्टवेयर घटक सिर्फ इसलिए खराब प्रदर्शन कर सकता है क्योंकि यह मूल लेखक की अज्ञानता के आधार पर मूर्खतापूर्ण ढंग से लिखा गया था और अनावश्यक रूप से जटिल था, (8 डेटाबेस कॉल करके एक इकाई बनाने के लिए जब सिर्फ एक करेगा , पूरी तरह से अनावश्यक कोड जिसके परिणामस्वरूप एकल कोड पथ की परवाह किए बिना, आदि ...) ये मामले कोड की गुणवत्ता में सुधार का एक मामला हैं और प्रदर्शन रिफ्लेक्टर के परिणामस्वरूप हो रहा है और प्रदर्शन बढ़ जाता है और अपेक्षित परिणाम जरूरी नहीं है।

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


3

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


2
    |
    पी
    ए
    आर
    एफ
    ओ *
    आर * 
    एम *
    ए *
    एन *
    सी * * * * *
    ए
    |
    O - आवश्यकता -

जैसा कि आप देख सकते हैं...

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

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


1

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


1

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

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

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

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


1

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

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


1

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

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

हार्डवेयर डिजाइनर लेटेस्ट सीपीयू में पावर सेव और क्लॉक स्केलिंग फीचर्स जोड़ने में कड़ी मेहनत कर रहे हैं। यह प्रोग्रामर पर निर्भर है कि हार्डवेयर इन क्षमताओं का अधिक से अधिक लाभ उठाएं, उपलब्ध हर सीपीयू घड़ी चक्र को चबाकर नहीं।

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


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

1

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

माइक्रो-क्षमता

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

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

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

क्रियात्मक भाषाएँ

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

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

पठनीयता बनाम रखरखाव

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

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


1
"माइक्रो-एफ़िशिएंसी" यह कहने की तरह है कि "ओ (1) मेमोरी एक्सेस जैसी कोई चीज़ नहीं है"
केलथ डे

0

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

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


जाहिर है आप अधिक समय दे सकते हैं, लेकिन अंततः आप सवाल करना शुरू करते हैं कि डेवलपर्स अपने बच्चों के लिए प्यार का इजहार करने के लिए प्रोग्रामिंग ईमैक से समय क्यों
निकालेंगे

0

क्योंकि अनुभवी प्रोग्रामर जान गए हैं कि यह सच है।

हमने कोड के साथ काम किया है जो दुबला है और मतलब है और इसमें प्रदर्शन के मुद्दे नहीं हैं।

हमने बहुत सारे कोड पर काम किया है, प्रदर्शन के मुद्दों को संबोधित करने के लिए बहुत जटिल है।

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


0

अत्यधिक अनुकूलित कोड के कुछ प्रसिद्ध टुकड़े भी हैं जो अधिकांश लोगों के दिमाग को झुका देंगे जो इस मामले का समर्थन करते हैं कि अत्यधिक अनुकूलित कोड पढ़ना और समझना मुश्किल है।

यहाँ मुझे लगता है कि सबसे प्रसिद्ध है। क्वेक III एरिना से लिया गया और जॉन कार्मक को जिम्मेदार ठहराया, हालांकि मुझे लगता है कि इस समारोह के कई पुनरावृत्तियां हुई हैं और यह मूल रूप से उनके द्वारा नहीं बनाया गया था ( विकिपीडिया महान नहीं है? )।

float Q_rsqrt( float number )
{
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y  = number;
    i  = * ( long * ) &y;                       // evil floating point bit level hacking
    i  = 0x5f3759df - ( i >> 1 );               // what the fuck?
    y  = * ( float * ) &i;
    y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
    //      y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed

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