बहुत कम स्तर पर (हार्डवेयर में), हाँ, यदि s महंगे हैं। यह समझने के लिए कि क्यों, आपको समझना होगा कि पाइपलाइन कैसे काम करती है।
निष्पादित किए जाने वाले वर्तमान अनुदेश को आमतौर पर अनुदेश सूचक (आईपी) या प्रोग्राम काउंटर (पीसी) नामक कुछ में संग्रहीत किया जाता है ; ये शब्द पर्यायवाची हैं, लेकिन अलग-अलग शब्दों का उपयोग विभिन्न आर्किटेक्चर के साथ किया जाता है। अधिकांश निर्देशों के लिए, अगले निर्देश का पीसी केवल वर्तमान पीसी है और वर्तमान निर्देश की लंबाई है। अधिकांश आरआईएससी आर्किटेक्चर के लिए, निर्देश सभी एक निरंतर लंबाई हैं, इसलिए पीसी को एक स्थिर राशि द्वारा बढ़ाया जा सकता है। C86C आर्किटेक्चर जैसे x86 के लिए, निर्देश चर-लंबाई हो सकते हैं, इसलिए निर्देश को डिकोड करने वाले तर्क को यह पता लगाना होगा कि वर्तमान अनुदेश अगले निर्देश का स्थान खोजने में कितना समय है।
के लिए शाखा निर्देश, हालांकि, अगले निर्देश निष्पादित करने के लिए नहीं वर्तमान अनुदेश के बाद अगले स्थान है। शाखाएं गोटो हैं - वे प्रोसेसर को बताते हैं कि अगला निर्देश कहां है। शाखाएं या तो सशर्त या बिना शर्त हो सकती हैं, और लक्ष्य स्थान को निश्चित या गणना किया जा सकता है।
सशर्त बनाम बिना शर्त को समझना आसान है - एक सशर्त शाखा केवल तभी ली जाती है जब एक निश्चित स्थिति रखती है (जैसे कि एक संख्या दूसरे के बराबर होती है); यदि शाखा नहीं ली जाती है, तो शाखा की तरह सामान्य होने के बाद अगले निर्देश पर नियंत्रण करें। बिना शर्त शाखाओं के लिए, शाखा हमेशा ली जाती है। सशर्त शाखाएं if
बयानों for
और while
लूप के नियंत्रण परीक्षणों में दिखाई देती हैं । बिना शर्त शाखाएं अनंत लूप्स, फ़ंक्शन कॉल, फ़ंक्शन रिटर्न break
और continue
स्टेटमेंट्स, कुख्यात goto
स्टेटमेंट और कई और अधिक (ये सूचियां संपूर्ण रूप से दूर हैं) में दिखाई देती हैं।
शाखा का लक्ष्य एक और महत्वपूर्ण मुद्दा है। अधिकांश शाखाओं का एक निश्चित शाखा लक्ष्य होता है - वे कोड में एक विशिष्ट स्थान पर जाते हैं जो संकलन समय पर तय किया जाता है। इसमें if
कथन, सभी प्रकार के लूप, नियमित फ़ंक्शन कॉल और कई और अधिक शामिल हैं। कंप्यूटेड शाखाएं रनटाइम के समय शाखा के लक्ष्य की गणना करती हैं। इसमें switch
कथन (कभी-कभी), एक फ़ंक्शन से लौटते हुए, वर्चुअल फ़ंक्शन कॉल और फ़ंक्शन पॉइंटर कॉल शामिल हैं।
तो यह सब प्रदर्शन के लिए क्या मतलब है? जब प्रोसेसर देखता है कि इसकी पाइपलाइन में एक शाखा निर्देश दिखाई देता है, तो यह पता लगाने की आवश्यकता है कि इसकी पाइपलाइन को कैसे जारी रखा जाए। प्रोग्राम स्ट्रीम में शाखा के बाद क्या निर्देश आते हैं, यह जानने के लिए, इसे दो चीजों को जानना होगा: (1) यदि शाखा ले जाया जाएगा और (2) शाखा का लक्ष्य। यह पता लगाना शाखा भविष्यवाणी कहलाता है , और यह एक चुनौतीपूर्ण समस्या है। यदि प्रोसेसर सही ढंग से अनुमान लगाता है, तो कार्यक्रम पूरी गति से जारी है। यदि इसके बजाय प्रोसेसर गलत तरीके से अनुमान लगाता है , तो यह गलत चीज की गणना करने में कुछ समय बिताता है। अब इसे अपनी पाइपलाइन को फ्लश करना होगा और इसे सही निष्पादन पथ के निर्देशों के साथ फिर से लोड करना होगा। निचला रेखा: एक बड़ा प्रदर्शन हिट।
इस प्रकार, कारण है कि अगर बयान महंगे हैं, तो शाखा के दुरुपयोग के कारण । यह केवल सबसे निचले स्तर पर है। यदि आप उच्च-स्तरीय कोड लिख रहे हैं, तो आपको इन विवरणों के बारे में चिंता करने की आवश्यकता नहीं है। यदि आप C या असेंबली में अत्यंत प्रदर्शन-महत्वपूर्ण कोड लिख रहे हैं, तो आपको केवल इस बारे में ध्यान रखना चाहिए। अगर ऐसा है, तो शाखा-मुक्त कोड लिखना अक्सर उस शाखाओं को कोड करने के लिए बेहतर हो सकता है, भले ही कई और निर्देशों की आवश्यकता हो। वहाँ कुछ शांत बिट twiddling चालें आप जैसे चीजों की गणना करने के लिए कर सकते हैं abs()
, min()
और max()
शाखाओं के बिना।