मैं कंप्यूटर विज्ञान में एक छात्र हूं और कार्यक्रमों और प्रकारों के बारे में "ओवरहेड" शब्द बहुत सुन रहा हूं। इसका वास्तव में क्या मतलब है?
मैं कंप्यूटर विज्ञान में एक छात्र हूं और कार्यक्रमों और प्रकारों के बारे में "ओवरहेड" शब्द बहुत सुन रहा हूं। इसका वास्तव में क्या मतलब है?
जवाबों:
यह एक ऑपरेशन स्थापित करने के लिए आवश्यक संसाधन हैं। यह असंबंधित लग सकता है, लेकिन आवश्यक है।
यह ऐसा है जब आपको कहीं जाने की आवश्यकता है, आपको कार की आवश्यकता हो सकती है। लेकिन, सड़क पर गाड़ी चलाने के लिए कार पकड़ना भारी पड़ जाएगा, इसलिए आप चलना चाहते हैं। हालांकि, ओवरहेड इसके लायक होगा यदि आप देश भर में जा रहे हैं।
कंप्यूटर विज्ञान में, कभी-कभी हम सड़क के नीचे जाने के लिए कारों का उपयोग करते हैं क्योंकि हमारे पास बेहतर रास्ता नहीं है, या यह "चलने के लिए सीखने" के लिए हमारे समय के लायक नहीं है।
शब्द का अर्थ संदर्भ के साथ बहुत भिन्न हो सकता है। सामान्य तौर पर, यह संसाधन (सबसे अधिक बार मेमोरी और सीपीयू समय) का उपयोग किया जाता है, जो सीधे इच्छित परिणाम में योगदान नहीं करते हैं, लेकिन उपयोग की जाने वाली तकनीक या विधि द्वारा आवश्यक हैं। उदाहरण:
malloc
में ब्लॉक प्लस गार्ड मानों के आकार के आबंटक (क्लासिक 32-बिट मशीन मानकर) के कारण 8 बाइट्स का एक निर्मित ओवरहेड है। और इससे पहले कि आप आवंटन की ग्रैन्युलैरिटी के बारे में भी सोचें। इसलिए सरल 4-बाइट पूर्णांकों की एक एकल-लिंक की गई सूची में 75% का ओवरहेड होगा; सरणियाँ बहुत बेहतर होती हैं (जब तक कि आपको बीच में तेज़ प्रविष्टि की आवश्यकता नहीं होती है) क्योंकि वे ओवरहेड एक बार (या कम, अगर सरणी गतिशील रूप से आवंटित नहीं होती हैं) हो सकती हैं।
आप थके हुए हैं और कोई और काम नहीं कर सकते। आप खाना खाते हैं। ऊर्जा भोजन की तलाश में, इसे प्राप्त करने और वास्तव में इसे खाने से ऊर्जा की खपत होती है और ओवरहेड होती है!
किसी कार्य को पूरा करने के लिए ओवरहेड कुछ बर्बाद हो जाता है। ओवरहेड को बहुत छोटा बनाने का लक्ष्य है।
कंप्यूटर विज्ञान में कहा गया है कि आप एक नंबर प्रिंट करना चाहते हैं, जो आपके काम को पूरा करता है। लेकिन संख्या को संग्रहीत करना, इसे प्रिंट करने के लिए डिस्प्ले सेट करना और इसे प्रिंट करने के लिए रूटीन को कॉल करना, फिर चर से संख्या तक पहुंचना सभी उपरी है।
विकिपीडिया ने हमें कवर किया है :
कंप्यूटर विज्ञान में, ओवरहेड को आम तौर पर अतिरिक्त या अप्रत्यक्ष गणना समय, मेमोरी, बैंडविड्थ या अन्य संसाधनों के संयोजन के रूप में माना जाता है जो किसी विशेष लक्ष्य को प्राप्त करने के लिए आवश्यक होते हैं। यह इंजीनियरिंग ओवरहेड का एक विशेष मामला है।
ओवरहेड आमतौर पर अतिरिक्त प्रोग्रामिंग (मेमोरी, प्रोसेसर, समय, आदि) की मात्रा का पुनरावर्तन करता है जो विभिन्न प्रोग्रामिंग एल्गोरिदम लेते हैं।
उदाहरण के लिए, एक संतुलित बाइनरी ट्री में डालने का ओवरहेड एक साधारण लिंक्ड लिस्ट में एक ही इंसर्ट की तुलना में बहुत बड़ा हो सकता है (इंसर्ट को अधिक समय लगेगा, ट्री को संतुलित करने के लिए अधिक प्रोसेसिंग पावर का उपयोग करना होगा, जिसके परिणामस्वरूप लंबे समय तक चलने वाले ऑपरेशन समय में परिणाम होगा उपभोक्ता)।
एक प्रोग्रामर ओवरहेड के लिए उन सिस्टम संसाधनों को संदर्भित करता है जो आपके कोड द्वारा उपभोग किए जाने पर इनपुट डेटा के दिए गए सेट पर प्लेटफॉर्म पर चल रहे हैं। आमतौर पर इस शब्द का उपयोग विभिन्न कार्यान्वयन या संभावित कार्यान्वयन की तुलना करने के संदर्भ में किया जाता है।
उदाहरण के लिए, हम कह सकते हैं कि एक विशेष दृष्टिकोण काफी सीपीयू ओवरहेड को उकसा सकता है, जबकि एक और अधिक मेमोरी ओवरहेड को उकसा सकता है और फिर भी एक और नेटवर्क ओवरहेड (और उदाहरण के लिए, एक बाहरी निर्भरता प्राप्त करने के लिए) भारित हो सकता है।
आइए एक विशिष्ट उदाहरण दें: संख्याओं के समूह के औसत (अंकगणितीय माध्य) की गणना करें।
स्पष्ट दृष्टिकोण इनपुट पर लूप करना है, एक चालू कुल और एक गिनती रखते हुए। जब अंतिम संख्या का सामना करना पड़ता है ("फाइल का अंत" ईओएफ, या कुछ प्रहरी मूल्य, या कुछ जीयूआई बटोम, जो भी हो) द्वारा संकेत दिया जाता है, तो हम बस कुल इनपुट की संख्या से विभाजित करते हैं और हम कर रहे हैं।
यह दृष्टिकोण सीपीयू, मेमोरी या अन्य संसाधनों के संदर्भ में लगभग कोई ओवरहेड नहीं है। (यह एक तुच्छ कार्य है)।
एक अन्य संभावित दृष्टिकोण एक सूची में इनपुट को "स्लरप" करना है। राशि की गणना करने के लिए सूची पर पुनरावृति करें, फिर सूची से मान्य वस्तुओं की संख्या से विभाजित करें।
इस दृष्टिकोण की तुलना करके, स्मृति ओवरहेड की मनमानी मात्रा को लागू किया जा सकता है।
एक विशेष खराब कार्यान्वयन में हम पुनरावृत्ति का उपयोग करके राशि संचालन कर सकते हैं लेकिन पूंछ-उन्मूलन के बिना। अब हमारी सूची के लिए मेमोरी ओवरहेड के अलावा, हम स्टैक ओवरहेड (जो कि मेमोरी का एक अलग प्रकार है और अक्सर मेमोरी के अन्य रूपों की तुलना में अधिक सीमित संसाधन है) का परिचय दे रहे हैं।
अभी तक एक और (यकीनन ज्यादा बेतुका) दृष्टिकोण आरडीबीएमएस में कुछ एसक्यूएल टेबल के सभी इनपुट को पोस्ट करना होगा। फिर बस उस टेबल के कॉलम पर SQL SUM फ़ंक्शन को कॉल करना। यह हमारे स्थानीय मेमोरी ओवरहेड को किसी अन्य सर्वर पर स्थानांतरित करता है, और हमारे निष्पादन पर नेटवर्क ओवरहेड और बाहरी निर्भरता को बढ़ाता है। (ध्यान दें कि रिमोट सर्वर में इस कार्य से जुड़ी कोई विशेष मेमोरी ओवरहेड नहीं हो सकती है --- यह स्टोरेज के सभी मानों को तुरंत स्टोर कर सकता है, उदाहरण के लिए)।
Hypothetically किसी प्रकार के क्लस्टर पर एक कार्यान्वयन पर विचार कर सकते हैं (संभवतः मूल्यों के अरबों के औसत को संभव बनाने के लिए)। इस मामले में किसी भी आवश्यक एन्कोडिंग और मूल्यों के वितरण (नोड्स के लिए उन्हें मैप करना) और परिणामों के संग्रह / टकराव (कमी) को ओवरहेड के रूप में गिना जाएगा।
हम प्रोग्रामर के स्वयं के कोड से परे कारकों द्वारा किए गए ओवरहेड के बारे में भी बात कर सकते हैं। उदाहरण के लिए 32 या 64 बिट प्रोसेसर के लिए कुछ कोड का संकलन एक पुराने 8-बिट या 16-बिट आर्किटेक्चर के लिए एक से अधिक ओवरहेड को उलझा सकता है। इसमें बड़ी मेमोरी ओवरहेड (संरेखण मुद्दे) या सीपीयू ओवरहेड शामिल हो सकते हैं (जहां सीपीयू को बिट ऑर्डर करने या गैर-संरेखित निर्देशों आदि का उपयोग करने के लिए मजबूर किया जाता है) या दोनों।
ध्यान दें कि आपके कोड द्वारा उठाए गए डिस्क स्थान और यह पुस्तकालयों, आदि को आमतौर पर "ओवरहेड" के रूप में संदर्भित नहीं किया जाता है, बल्कि इसे "पदचिह्न" कहा जाता है। साथ ही आपके प्रोग्राम की खपत (किसी भी डेटा सेट के बारे में जानकारी के बिना) बेस मेमोरी को इसका "पदचिह्न" कहा जाता है।
ओवरहेड बस कार्यक्रम निष्पादन में अधिक समय लेने वाला है। उदाहरण ; जब हम किसी फ़ंक्शन को कॉल करते हैं और उसका नियंत्रण पास किया जाता है, जहां उसे परिभाषित किया जाता है और फिर उसके शरीर को निष्पादित किया जाता है, इसका मतलब है कि हम अपने सीपीयू को एक लंबी प्रक्रिया से चलाने के लिए बनाते हैं (पहले नियंत्रण को स्मृति में अन्य स्थान पर भेजते हैं और फिर वहां निष्पादित करते हैं और फिर नियंत्रण वापस पूर्व स्थिति में दे रहा है), फलस्वरूप इसमें बहुत अधिक समय लगता है, इसलिए ओवरहेड। हमारा लक्ष्य फ़ंक्शन परिभाषा और कॉलिंग समय के दौरान इनलाइन का उपयोग करके इस ओवरहेड को कम करना है, जो फ़ंक्शन कॉल में फ़ंक्शन की सामग्री की प्रतिलिपि बनाता है इसलिए हम नियंत्रण को किसी अन्य स्थान पर नहीं भेजते हैं, लेकिन एक पंक्ति में हमारे कार्यक्रम को जारी रखते हैं, इसलिए इनलाइन ।
आप एक शब्दकोश का उपयोग कर सकते हैं। परिभाषा वही है। लेकिन आपको समय बचाने के लिए, ओवरहेड उत्पादक कार्य करने के लिए आवश्यक कार्य है। उदाहरण के लिए, एक एल्गोरिथ्म चलता है और उपयोगी काम करता है, लेकिन इसके काम करने के लिए मेमोरी की आवश्यकता होती है। यह मेमोरी आवंटन में समय लगता है, और यह सीधे काम से संबंधित नहीं है, इसलिए ओवरहेड है।
आप विकिपीडिया की जाँच कर सकते हैं । लेकिन मुख्य रूप से जब अधिक कार्यों या संसाधनों का उपयोग किया जाता है। जैसे अगर आप .NET से परिचित हैं तो आपके पास वैल्यू टाइप और रेफरेंस टाइप हो सकते हैं। संदर्भ प्रकारों में मेमोरी ओवरहेड होती है क्योंकि उन्हें मूल्य प्रकारों की तुलना में अधिक मेमोरी की आवश्यकता होती है।
ओवरहेड का एक ठोस उदाहरण "स्थानीय" प्रक्रिया कॉल और "दूरस्थ" प्रक्रिया कॉल के बीच का अंतर है।
उदाहरण के लिए, क्लासिक RPC (और EJB जैसे कई अन्य दूरस्थ फ्रेमवर्क) के साथ, एक फ़ंक्शन या मेथड कॉल एक कोडर के समान दिखता है, चाहे वह एक स्थानीय हो, मेमोरी कॉल में, या एक वितरित, नेटवर्क कॉल।
उदाहरण के लिए:
service.function(param1, param2);
क्या यह एक सामान्य विधि है, या कोई दूरस्थ विधि है? आप यहां जो देख रहे हैं, उससे आप नहीं बता सकते।
लेकिन आप सोच सकते हैं कि दो कॉल के बीच निष्पादन के समय में अंतर नाटकीय है।
इसलिए, जबकि कोर कार्यान्वयन "समान लागत" होगा, इसमें शामिल "ओवरहेड" काफी अलग है।
डेटा के अलावा इसके कुछ भी, यानी tcp झंडे, हेडर, crc, fcs आदि।