अनुकूलन के बीच संतुलन रखने और प्राप्त करने का आपका तरीका क्या है?
कार्यान्वयन के विवरण पर इसे आसान बनाएं लेकिन ऑप्टिमाइज़ करने के लिए बहुत सारे श्वास कक्ष के साथ डिज़ाइन तैयार करें। अब यह मुश्किल हिस्सा है, लेकिन जब आप इसे इस्तेमाल करते हैं तो यह उतना कठिन नहीं होता है जितना लगता है। लोगों को खुद को बाधात्मक डिजाइन में फंसने का सामान्य कारण आमतौर पर बहुत दानेदार है।
इसके द्वारा, एक चरम उदाहरण के रूप में एक वीडियो प्रोसेसिंग एप्लिकेशन लेते हैं जिसका डिजाइन एक सार IPixel
के आसपास घूमता है। सॉफ़्टवेयर को विभिन्न पिक्सेल प्रारूपों के साथ आसानी से वीडियो को संभालने की अनुमति देने के लिए वहां मौजूद है और अभी भी एक समान कोड लिखता है जो सभी पिक्सेल प्रारूपों के साथ काम करता है।
इस तरह का एक आवेदन केंद्रीय डिजाइन स्तर पर प्रदर्शन के मामले में खराब हो गया है, कभी भी महाकाव्य वास्तुशिल्प पुनर्लेखन के बिना संपादन, एन्कोडिंग, डिकोडिंग और प्लेबैक के लिए प्रतिस्पर्धी प्रदर्शन प्रदान करने की संभावना नहीं है। और ऐसा इसलिए है क्योंकि यह एक स्तर के बहुत granular पर सार का चयन किया।
एक पिक्सेल के स्तर पर सारणी चुनकर, प्रति-पिक्सेल आधार पर गतिशील प्रेषण ओवरहेड होता है। वर्चुअल प्रेषण, रन टाइम टाइप जानकारी (प्रतिबिंब, उदाहरण) इत्यादि जैसी सुविधाओं को अनुमति देने के लिए समान वर्चुअल पॉइंटर (या जो कुछ भी भाषा उपयोग करता है) चलाने के लिए अक्सर पूरे पिक्सेल की तुलना में बड़ा होता है, इसकी स्मृति उपयोग को दोगुना या तीन गुना करना और क्रमशः कैश मिस प्रक्रिया। इसके अलावा यदि आप हिंदसाइट में कई क्षेत्रों में छवि प्रसंस्करण को मल्टीथ्रेड करना चाहते हैं, तो आपको एक ही समय में एक IPixel
के साथ काम कर रहे प्रत्येक स्थान को फिर से लिखना होगा।
इस बीच यह सब से बचा जा सकता था अगर सॉफ़्टवेयर ने IImage
जैसे कोसर स्तर पर अपने अवशोषणों को आसानी से डिजाइन किया था, और शेष सिस्टम में व्यक्तिगत पिक्सेल ऑब्जेक्ट्स को उजागर करने से बचा था। एक छवि प्रभावी रूप से संग्रह पिक्सल (अक्सर लाखों पिक्सेल) है और यह एक समय में कई पिक्सल को संसाधित करने वाले संचालन प्रदान कर सकती है। अब प्रोसेसिंग पिक्सेल से जुड़े प्रसंस्करण और मेमोरी ओवरहेड को एक लाख-पिक्सेल छवि के लिए 1/1,000,000 वें स्थान पर घटा दिया गया है, जिस बिंदु पर यह छोटा हो जाता है। यह छवि संचालन को सांस लेने के कमरे को छोड़ देता है जैसे कि समानांतर में प्रक्रिया पिक्सेल और केंद्रीय स्तर पर वेक्टरिज्ड अब कोड की महाकाव्य राशि को दोबारा लिखने के बिना, क्लाइंट कोड व्यक्तिगत रूप से एक पिक्सेल को एक समय में संसाधित नहीं कर रहा है बल्कि इसके बजाय पूरी तरह से अनुरोध कर रहा है छवि संचालन किया जाना है।
हालांकि यह छवि प्रसंस्करण के साथ नो-ब्रेनर जैसा प्रतीत हो सकता है जो मूल रूप से एक बहुत ही प्रदर्शन-महत्वपूर्ण क्षेत्र है, अन्य डोमेन में ऐसा करने के लिए बहुत सारे कमरे हैं। अपने क्लासिक विरासत उदाहरण के साथ, आपको Dog
Mammal
प्राप्त करने की आवश्यकता नहीं है। आप Dogs
Mammals
प्राप्त कर सकते हैं।
तो चीजों को पूरा करने के लिए वापस, मैं डेटा-उन्मुख मानसिकता के साथ शुरू करता हूं ताकि सबसे कुशल कैश-अनुकूल, शर्मनाक समानांतर, थ्रेड-सुरक्षित, सिम-फ्रेंडली डेटा प्रस्तुतियों और अत्याधुनिक डेटा संरचनाओं और एल्गोरिदम नहीं मिल सकें पहली कोशिश पर। अन्यथा मैं पूरे सप्ताह व्यतीत कर सकता हूं कि वीटीयूएन के साथ चीजों को ट्यून करना जबकि बेंचमार्क तेजी से और तेज हो जाते हैं (मुझे यह करना अच्छा लगता है लेकिन यह निश्चित रूप से हर जगह और आगे काम करने के लिए उत्पादक नहीं है)। मैंने केवल चीजों को डिजाइन करने के लिए उपयोग की जाने वाली ग्रैन्युलरिटी के उपयुक्त स्तर को निर्धारित करने के लिए पर्याप्त विचार किया है: "क्या मुझे सिस्टम को Dog
या Dogs
पर निर्भर करना चाहिए?", इस तरह की चीज। और यह भी इतना विचार की आवश्यकता नहीं है। ओओपी के लिए यह पसंद है, "क्या सिस्टम हर एक फ्रेम में सौ हजार कुत्तों को संसाधित करता है? हाँ/नहीं?" यदि "हां", केंद्रीय Dog
इंटरफ़ेस डिज़ाइन न करें और केंद्रीय IMammal
इंटरफ़ेस को डिज़ाइन न करें। Dogs
IMammals
का उत्तराधिकारी होने के लिए, जैसा कि हम एक समय में लाखों पिक्सल को संसाधित करने जा रहे हैं, जैसा कि हम ऊपर समान छवि प्रसंस्करण परिदृश्य में IPixel
इंटरफ़ेस से बचते हैं।
डेटा का आकार आपको हिट भी देना चाहिए। यदि डेटा 64 बाइट्स या उससे कम की तरह छोटा है, तो संभावना है कि इसे एक इंटरफ़ेस का खुलासा नहीं करना चाहिए जो निर्भरताओं को जमा करता है जब तक यह निश्चित रूप से प्रदर्शन-महत्वपूर्ण नहीं होता है। इसके बजाय इसे एक साथ कई चीजों से निपटने के लिए एक संग्रह इंटरफ़ेस का खुलासा करना चाहिए। इस बीच यदि डेटा 4 किलोबाइट्स की तरह विशाल है, तो संभावना है कि यह संग्रह संग्रह इंटरफ़ेस का पर्दाफाश करने में मुश्किल से मदद करेगा और आप सुविधा के समय इन चीज़ों में से किसी एक से निपटने वाले स्केलर इंटरफ़ेस को डिज़ाइन कर सकते हैं।
मल्टीथ्रेडिंग एक ही तरह की चीज है। आप स्तर के बहुत दानेदार पर लॉक नहीं करना चाहते हैं, उदाहरण के लिए, और आप नहीं चाहते हैं कि आपके एक्सेस पैटर्न साझा संसाधनों को मारने के लिए रखें। थ्रेड सुरक्षा के लिए आप कोड के एक भाग को लेने में सक्षम होना चाहते हैं और आसानी से कारण क्या है कि किस धागे से राज्य का उपयोग किया जा रहा है।ऐसा करने के लिए आपको एक समेकित डिज़ाइन की आवश्यकता है जिसमें अधिक समरूप प्रसंस्करण हो ताकि आप आसानी से डिज़ाइन के कार्यान्वयन के भीतर मेमोरी एक्सेस पैटर्न के बारे में आसानी से नियंत्रण कर सकें और साझा संसाधनों तक पहुंच को कम कर सकें, स्तर के बहुत दानेदार पर लॉकिंग से बचें या संभावित रूप से भी लॉकिंग से बचें। जब तक आपके डिज़ाइन पर्याप्त श्वास कक्ष छोड़ते हैं, आप अंत में एक बहुत सारी चीजें प्राप्त कर सकते हैं, लेकिन कुंजी स्वयं को सांस लेने का कमरा छोड़ना है।
गैर-सजातीय प्रसंस्करण करने वाले सिस्टम में अलग-अलग चीजों के एक बोतलबंद द्वारा एक किशोर चीज पर निर्भर करता है, ऐसा कोई कमरा नहीं है। वहां आप उपयोग करने के लिए केवल 10 मीटर सड़क के साथ एनालॉगिकल रेस कार के परिदृश्य के साथ समाप्त हो सकते हैं। एक भारी चीज जो किशोरों की चीजों के बोतलबंद को संसाधित करती है, जो एक साथ स्टोर करती है, बाद में अनुकूलित करने के लिए अंतहीन कमरे छोड़ देती है।
यह काफी व्यक्तिपरक है, सीडब्ल्यू की सिफारिश करें। –
क्या आप कुछ और ठोस उदाहरण बना सकते हैं? मेरी राय में "सामान्य कथन" गलत है। मेरा मतलब है कि समवर्ती ग्राहक अनुरोधों की सेवा करने वाला एक सर्वर घटक किसी प्रकार का अच्छा "बहुप्रचारित डिज़ाइन" की आवश्यकता है। – Alex
@Alex: यदि आपका मतलब वेबसर्वर है तो मुझे यह कहना होगा कि मुझे सर्वर घटकों को लगभग मल्टीथ्रेडेड डिज़ाइन की आवश्यकता नहीं है क्योंकि डेटाबेस आमतौर पर सिंक्रनाइज़ेशन का एक बिंदु होता है और क्योंकि मैंने कभी भी वेब सर्वर घटक नहीं देखा है जो एल्गोरिदमिकल था उदाहरण के लिए जटिल डेटाबेस या कंपाइलर की तुलना में। वास्तव में – Lothar