খুব নিম্ন স্তরে (হার্ডওয়্যারে), হ্যাঁ, যদি ব্যয় হয়। কেন বুঝতে হবে, আপনাকে বুঝতে হবে কীভাবে পাইপলাইনগুলি কাজ করে।
কার্যকর করার জন্য বর্তমান নির্দেশটি সাধারণত নির্দেশ নির্দেশক (আইপি) বা প্রোগ্রাম কাউন্টার (পিসি) নামক কিছুতে সংরক্ষণ করা হয় ; এই পদগুলি সমার্থক, তবে বিভিন্ন আর্কিটেকচারের সাথে বিভিন্ন পদ ব্যবহার করা হয়। বেশিরভাগ নির্দেশনার জন্য, পরবর্তী নির্দেশের পিসি হ'ল বর্তমান পিসি প্লাস বর্তমান নির্দেশের দৈর্ঘ্য। বেশিরভাগ আরআইএসসি আর্কিটেকচারের জন্য, নির্দেশাবলী সমস্ত ধ্রুবক দৈর্ঘ্য হয়, তাই পিসি একটি ধ্রুবক পরিমাণ দ্বারা বাড়ানো যায়। সিআইএসসি আর্কিটেকচারের জন্য যেমন x86, নির্দেশগুলি পরিবর্তনশীল দৈর্ঘ্য হতে পারে, সুতরাং নির্দেশকে ডিকোড করে যুক্তিটি পরবর্তী নির্দেশের অবস্থানটি সন্ধানের জন্য বর্তমান নির্দেশটি কত দিন স্থায়ী হবে তা নির্ধারণ করতে হবে।
জন্য শাখা নির্দেশাবলী, তবে পরবর্তী নির্দেশ মৃত্যুদন্ড কার্যকর করা হবে না বর্তমান নির্দেশ পর পরবর্তী অবস্থান। শাখাগুলি গোটোস - তারা প্রসেসরকে জানায় যে পরবর্তী নির্দেশিকাটি কোথায়। শাখাগুলি শর্তাধীন বা শর্তহীন হতে পারে এবং লক্ষ্য অবস্থানটি হয় স্থির বা গণিত করা যেতে পারে।
শর্তাধীন বনাম শর্তহীন বুঝতে সহজ - একটি শর্তাধীন শাখা কেবল তখনই নেওয়া হয় যখন কোনও নির্দিষ্ট শর্ত ধরে থাকে (যেমন একটি সংখ্যা অন্যটির সমান কিনা); যদি শাখাটি নেওয়া না হয় তবে নিয়ন্ত্রণটি নিয়মের মতো শাখার পরে পরবর্তী নির্দেশে এগিয়ে যায়। নিঃশর্ত শাখার জন্য, শাখাটি সর্বদা নেওয়া হয়। শর্তাধীন শাখা if
বিবৃতিতে for
এবং while
লুপগুলির নিয়ন্ত্রণ পরীক্ষায় প্রদর্শিত হয় । শর্তহীন শাখাগুলি অসীম লুপ, ফাংশন কল, ফাংশন রিটার্ন break
এবং continue
বিবৃতি, কুখ্যাত goto
বিবৃতি এবং আরও অনেক কিছুতে প্রদর্শিত হয় (এই তালিকাগুলি সম্পূর্ণ বিস্তৃত নয়)।
শাখার লক্ষ্য আরও একটি গুরুত্বপূর্ণ বিষয় issue বেশিরভাগ শাখার একটি নির্দিষ্ট শাখার লক্ষ্য থাকে - তারা কোডের একটি নির্দিষ্ট স্থানে যায় যা সংকলনের সময় স্থির করা হয়। এর মধ্যে রয়েছে if
স্টেটমেন্টস, সমস্ত প্রকারের লুপস, নিয়মিত ফাংশন কল এবং আরও অনেক কিছু। গণিত শাখাগুলি রানটাইমের সময় শাখার লক্ষ্য গণনা করে। এর মধ্যে switch
স্টেটমেন্ট (কখনও কখনও), কোনও ফাংশন থেকে ফিরে আসা, ভার্চুয়াল ফাংশন কল এবং ফাংশন পয়েন্টার কল অন্তর্ভুক্ত থাকে।
তাহলে এগুলি পারফরম্যান্সের জন্য কী বোঝায়? প্রসেসর যখন দেখতে পাবে কোনও শাখার নির্দেশটি তার পাইপলাইনে উপস্থিত হয়, তখন কীভাবে এটির পাইপলাইন পূরণ করা চালিয়ে যেতে হবে তা নির্ধারণ করা দরকার। প্রোগ্রামের প্রবাহে শাখার পরে কী নির্দেশাবলী আসে তা নির্ধারণ করার জন্য, এটি দুটি বিষয় জেনে রাখা দরকার: (১) যদি শাখা নেওয়া হবে এবং (২) শাখার লক্ষ্যবস্তু। এটি নির্ধারণের জন্য শাখার পূর্বাভাস বলা হয় এবং এটি একটি চ্যালেঞ্জিং সমস্যা। যদি প্রসেসরটি সঠিকভাবে অনুমান করে তবে প্রোগ্রামটি পুরো গতিতে অব্যাহত থাকে। পরিবর্তে যদি প্রসেসরটি ভুলভাবে অনুমান করে তবে এটি ভুল জিনিসটি গণনায় কিছুটা সময় ব্যয় করেছে। এখন এটির পাইপলাইন ফ্লাশ করে সঠিক এক্সিকিউশন পাথের নির্দেশাবলীর সাথে এটি পুনরায় লোড করতে হবে। নীচের লাইন: একটি দুর্দান্ত পারফরম্যান্স হিট।
সুতরাং, বিবৃতি ব্যয়বহুল হবার কারণ শাখার ভুল-অনুমানের কারণে । এটি কেবল সর্বনিম্ন স্তরে। আপনি যদি উচ্চ-স্তরের কোড লিখছেন তবে আপনাকে এই বিবরণটি নিয়ে মোটেই চিন্তা করার দরকার নেই। আপনি যদি কেবল সি বা অ্যাসেমব্লিতে চূড়ান্ত পারফরম্যান্স-সমালোচনামূলক কোড লিখছেন তবে আপনার কেবল এটির যত্ন নেওয়া উচিত। যদি এটি হয় তবে শাখা-মুক্ত কোড লেখার ক্ষেত্রে শাখাবিহীন কোডগুলি প্রায়শই কোডের তুলনায় উচ্চতর হতে পারে, এমনকি আরও বেশ কয়েকটি নির্দেশাবলীর প্রয়োজন হয়। কিছু শীতল বিট-twiddling ঠাট আপনি এই ধরনের এখানে কিছু গনা কি করতে পারেন abs()
, min()
এবং max()
শাখাবিন্যাস ছাড়া।