"अगर" महंगा है?


98

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

मॉड्यूल "डेटा संरचनाएं और एल्गोरिदम" है और उन्होंने हमें कुछ लाइनों के साथ बताया:

ifबयान सबसे महंगी [कुछ] है। [कुछ] रजिस्टर [कुछ]।

हां, मेरे पास एक भयानक स्मृति है और मुझे वास्तव में खेद है, लेकिन मैं घंटों से गुगली कर रहा हूं और कुछ भी सामने नहीं आया है। कोई विचार?


29
अपने शिक्षक से एक विकल्प पूछ रहा है?
माइकल मायर्स

7
आप अपने शिक्षक को ईमेल क्यों नहीं करते हैं? जब तक आपके शिक्षक ने कहा कि यह तब तक किसी को भी पता नहीं है कि आपके शिक्षक ने क्या कहा है, जब तक वे वहां नहीं थे (या आपका शिक्षक खुद एसओ पढ़ता है)।
बिल करविन

11
और निश्चित रूप से अनिवार्य रेल उत्तर के
bobobobo

यदि कथन या विशेष रूप से "?:" सी-प्रभावित घुंघराले-ब्रैकेट भाषाओं में अभिव्यक्तियाँ जैसे x86 और आर्म प्रोसेसर पर विशेष सशर्त निष्पादन निर्देशों द्वारा लागू की जा सकती हैं। ये निर्देश हैं जो या तो पूर्व परीक्षण के आधार पर कुछ ऑपरेशन करते हैं या नहीं करते हैं। इन उत्कृष्ट निर्देशों का उपयोग सशर्त कूद / शाखा / 'गोटो' निर्देशों की आवश्यकता को पूरी तरह से रोकता है। कार्यक्रम के प्रवाह को पूरी तरह से अनुमानित करने से कुछ स्थितियों में भारी प्रदर्शन में सुधार होता है क्योंकि यह सीधे कोड में विभिन्न बिंदुओं पर कूदते हुए (संभवतः अप्रत्याशित) नहीं है।
सेसिल वार्ड

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

जवाबों:


185

बहुत कम स्तर पर (हार्डवेयर में), हाँ, यदि s महंगे हैं। यह समझने के लिए कि क्यों, आपको समझना होगा कि पाइपलाइन कैसे काम करती है।

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

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

सशर्त बनाम बिना शर्त को समझना आसान है - एक सशर्त शाखा केवल तभी ली जाती है जब एक निश्चित स्थिति रखती है (जैसे कि एक संख्या दूसरे के बराबर होती है); यदि शाखा नहीं ली जाती है, तो शाखा की तरह सामान्य होने के बाद अगले निर्देश पर नियंत्रण करें। बिना शर्त शाखाओं के लिए, शाखा हमेशा ली जाती है। सशर्त शाखाएं ifबयानों forऔर whileलूप के नियंत्रण परीक्षणों में दिखाई देती हैं । बिना शर्त शाखाएं अनंत लूप्स, फ़ंक्शन कॉल, फ़ंक्शन रिटर्न breakऔर continueस्टेटमेंट्स, कुख्यात gotoस्टेटमेंट और कई और अधिक (ये सूचियां संपूर्ण रूप से दूर हैं) में दिखाई देती हैं।

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

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

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


20
यह सिर्फ शाखा की गलतफहमी नहीं है। शाखाएँ निर्देश पुनर्स्थापना को संकलक स्तर पर भी रोकती हैं, और कुछ हद तक सीपीयू स्तर पर (एक आउट-ऑफ-ऑर्डर सीपीयू के लिए, निश्चित रूप से)। हालांकि अच्छा विस्तृत जवाब।
जलफ

5
यदि उच्च-स्तरीय भाषाओं को अंततः निम्न-स्तरीय भाषाओं में अनुवादित किया जाता है और आप बहुत ही प्रदर्शन-केंद्रित कोड लिख रहे हैं, तो क्या आप अभी भी कोड लिखकर कुछ भी हासिल नहीं करते हैं जो कि बयान से बचता है? क्या यह अवधारणा उच्च-स्तरीय भाषाओं में नहीं है?
c ..

18

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

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


1
निश्चित रूप से सापेक्ष ... cmp / cond jmp अभी भी कई प्रोसेसरों पर mul की तुलना में तेज़ है।
ब्रायन नोब्लुच

4
हां, मैं सहमत हूं कि मुझे इसके बारे में चिंतित नहीं होना चाहिए। मैं यहाँ कुछ भी ऑप्टिमाइज़ करने की कोशिश नहीं कर रहा हूँ। मैं सिर्फ जानने और जानने की कोशिश कर रहा हूं। ;)
पीके

15

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


13

सेल प्रदर्शन पर शाखा उन्मूलन के माध्यम से बेहतर प्रदर्शन लेख देखें । एक और मजेदार यह है कि यह पोस्ट शाखा रहित चयन के बारे में है रियल टाइम कोलिजन डिटेक्शन ब्लॉग पर ।

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

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


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

10

ifअपने आप में धीमा नहीं है । धीमापन हमेशा मेरे जीवन के लिए सापेक्ष होता है कि आपने कभी भी इफ-स्टेटमेंट के "ओवरहेड" को महसूस नहीं किया है। यदि आप एक उच्च-प्रदर्शन कोड बनाने जा रहे हैं, तो आप वैसे भी शाखाओं से बचना चाहते हैं। क्या ifधीमा करता है कि प्रोसेसर ifकुछ हेयुरिस्टिक और व्हाट्सएप पर आधारित के बाद से कोड लोड कर रहा है । यह ifमशीन कोड में शाखा निर्देश के बाद सीधे कोड निष्पादित करने से पाइपलाइनों को भी रोक देगा , क्योंकि प्रोसेसर को अभी तक नहीं पता है कि क्या रास्ता लिया जाएगा (एक पाइपलाइज्ड प्रोसेसर में, कई निर्देश interleaved और निष्पादित होते हैं)। निष्पादित कोड रिवर्स में निष्पादित किया जा सकता था (यदि दूसरी शाखा ली गई थी। इसे कहा जाता है branch misprediction), या noopउन स्थानों पर भरा जाना चाहिए ताकि ऐसा न हो।

यदि ifबुराई है, तो switchबुराई भी है, और &&, ||भी। इसके बारे में चिंता मत करो।


7

न्यूनतम संभव स्तर ifपर (विशेष रूप से सभी ऐप-विशिष्ट पूर्वापेक्षाओं की गणना करने के बाद if) शामिल हैं:

  • कुछ परीक्षण निर्देश
  • यदि परीक्षण सफल होता है तो कोड में किसी स्थान पर जाएं, अन्यथा आगे बढ़ें।

इससे जुड़ी लागतें:

  • एक निम्न स्तर की तुलना - आमतौर पर 1 सीपीयू ऑपरेशन, सुपर सस्ते
  • संभावित छलांग - जो महंगी हो सकती है

रैंप क्यों महंगा है:

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

इसलिए योग करने के लिए:

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

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

7

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

मैं इसे लंबी मालगाड़ी के रूप में सोचता हूं। यह बहुत सी कार्गो को एक सीधी रेखा में तेजी से ले जा सकता है, लेकिन यह बुरी तरह से कोने में है।

पेंटियम 4 (प्रेस्कॉट) में 31 चरणों की एक प्रसिद्ध लंबी पाइपलाइन थी।

विकिपीडिया पर अधिक


3
मालगाड़ी के रूपक के लिए +1 - मुझे याद होगा कि अगली बार मुझे प्रोसेसर पाइपलाइनों की व्याख्या करने की आवश्यकता है।
डैनियल प्रीडेन

6

हो सकता है कि ब्रांचिंग सीपीयू इंस्ट्रक्शन प्रीफेटिंग को मार दे?


मेरे ... "शोध" पर मैंने स्विच स्टेटमेंट के लिए जंप टेबल और ब्रांचिंग के बारे में सीखा, लेकिन अगर स्टेटमेंट्स के बारे में कुछ नहीं। क्या आप उस पर थोड़ा विस्तार कर सकते हैं?
pek

IIRC, CPU आमतौर पर एक ही संभावित निष्पादन पथ के साथ निर्देश पूर्वनिर्धारित कर रहा है, लेकिन एक 'यदि' कथन जो पूर्वानुमानित निष्पादन पथ से एक शाखा का कारण बनता है, तो यह पूर्वनिर्धारित अनुदेशों को अमान्य कर देगा और प्रीचिंग को पुनः आरंभ करना होगा।
कार्यकर्ता

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

2
इसके अलावा, CPU आमतौर पर आगामी निर्देशों को जल्दी से निष्पादित करना शुरू करने के लिए तत्पर रहता है (न कि उन्हें पहले से बताएं), और कंपाइलर निर्देशों को पुन: व्यवस्थित करने की कोशिश करता है, और यह शाखाओं के बीच खतरनाक हो जाता है, इसलिए आप वास्तव में बहुत अधिक शाखाओं के साथ निर्देश निर्धारण को मार सकते हैं। जो प्रदर्शन को आहत करता है।
जालपा २४'०

6

यह भी ध्यान दें कि लूप के अंदर बहुत जरूरी नहीं है।

आधुनिक सीपीयू एक इफ-स्टेटमेंट के पहले दौरे पर मानता है, कि "इफ-बॉडी" को लिया जाना है (या दूसरे तरीके से कहा जाए: यह लूप-बॉडी को कई बार लिया जा सकता है) (*)। दूसरी और आगे की यात्राओं पर, यह (CPU) शाखा इतिहास तालिका में देख सकता है, और देख सकता है कि पिछली बार स्थिति कैसी थी (क्या यह सच था? क्या यह गलत था?)। यदि यह पिछली बार गलत था, तो सट्टा निष्पादन, यदि या "लूप" के "आगे" के लिए आगे बढ़ेगा।

(*) नियम वास्तव में " फॉरवर्ड ब्रांच नहीं लिया गया, बैकवर्ड ब्रांच लिया गया " है। यदि एक इफ-स्टेटमेंट में, केवल एक [फॉरवर्ड] जंप ( अगर-बॉडी के बाद के बिंदु तक ) है यदि स्थिति झूठी का मूल्यांकन करती है (याद रखें: सीपीयू वैसे भी एक शाखा / कूद नहीं लेने के लिए मानता है), लेकिन एक लूप में , लूप (नहीं लिया जा सकता) के बाद स्थिति के लिए एक आगे शाखा है, और दोहराव पर एक पिछड़ी शाखा (लिया जा करने के लिए)।

यह भी एक कारण है कि आभासी फ़ंक्शन या फ़ंक्शन-पॉइंटर-कॉल के लिए कॉल उतना अधिक बुरा नहीं है जितना कि कई धारणाएं ( http://phresnel.org/blog/ )


5

जैसा कि कई लोगों ने कहा है, आधुनिक कंप्यूटर पर सशर्त शाखाएं बहुत धीमी हो सकती हैं।

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


4

केवल एक चीज जिसकी मैं कल्पना कर सकता हूं, वह यह हो सकता है कि तथ्य यह है कि एक ifबयान आमतौर पर एक शाखा में परिणाम कर सकता है। प्रोसेसर वास्तुकला की बारीकियों के आधार पर, शाखाएं पाइपलाइन स्टालों या अन्य इष्टतम स्थितियों से कम का कारण बन सकती हैं।

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

उस सभी ने कहा - इस सामान की चिंता करने से पहले अपना तर्क सही कर लें। गलत कोड उतना ही अनधिकृत है जितना आप प्राप्त कर सकते हैं।


मैंने सुना है कि एआरएम के सशर्त निर्देश ILP को रोकते हैं ताकि वे बस समस्या को चारों ओर धकेल सकें।
JD

3

सीपीयू को गहराई से पाइपलाइज किया जाता है। किसी भी शाखा निर्देश (यदि / for / जबकि / स्विच / आदि) का अर्थ है कि सीपीयू वास्तव में नहीं जानता है कि अगले लोड और चलाने के लिए क्या निर्देश है।

सीपीयू या तो स्टाल करता है, यह जानने के लिए इंतजार करता है कि क्या करना है, या सीपीयू एक अनुमान लगाता है। पुराने सीपीयू के मामले में, या यदि अनुमान गलत है, तो आपको एक पाइपलाइन स्टाल भुगतना होगा, जबकि यह सही निर्देश को लोड करता है। सीपीयू के आधार पर यह स्टाल के लायक 10-20 निर्देशों के बराबर हो सकता है।

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

कक्षा में शुभकामनाएँ।

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


2

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


1

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

कुछ संकलक उच्च स्तरीय प्रोग्रामिंग भाषाओं (जैसे सी / सी ++) के विस्तार के रूप में इन्हें (जीसीसी की तरह) उजागर करते हैं।

देखें संभावना () / संभावना नहीं () लिनक्स कर्नेल में मैक्रो - वे कैसे काम करते हैं? उनका क्या लाभ है?


0

एक बार मेरे एक मित्र के साथ मेरा यह तर्क था। वह एक बहुत ही भोली सर्कल एल्गोरिथ्म का उपयोग कर रहा था, लेकिन उसने दावा किया कि वह मेरी तुलना में तेज़ है (जिस तरह से केवल सर्कल के 1/8 वें गणना करता है) क्योंकि मेरा उपयोग किया गया था। अंत में, अगर स्टेटमेंट को sqrt के साथ बदल दिया गया और किसी तरह यह तेजी से हुआ। शायद इसलिए कि FPU में sqrt बनाया गया है?


-1

ALU उपयोग के संदर्भ में सबसे महंगा? यह तुलना करने के लिए मूल्यों को संचय करने के लिए सीपीयू रजिस्टरों का उपयोग करता है और यदि कथन चलता है तो हर बार मूल्यों को लाने और तुलना करने में समय लगता है।

इसलिए उस का एक अनुकूलन एक तुलना करना है और परिणाम को लूप चलने से पहले एक चर के रूप में संग्रहीत करना है।

बस अपने लापता शब्दों की व्याख्या करने की कोशिश कर रहा है।

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