ในระดับต่ำสุด (ในฮาร์ดแวร์) ใช่ถ้า s มีราคาแพง เพื่อให้เข้าใจว่าทำไมคุณต้องเข้าใจว่าท่อทำงานอย่างไร
คำสั่งปัจจุบันที่จะดำเนินการจะถูกเก็บไว้ในสิ่งที่มักเรียกว่าตัวชี้คำสั่ง (IP) หรือตัวนับโปรแกรม (PC) คำเหล่านี้มีความหมายเหมือนกัน แต่ใช้คำต่างกันกับสถาปัตยกรรมที่แตกต่างกัน สำหรับคำแนะนำส่วนใหญ่พีซีของคำสั่งถัดไปเป็นเพียงพีซีปัจจุบันบวกกับความยาวของคำสั่งปัจจุบัน สำหรับสถาปัตยกรรม RISC ส่วนใหญ่คำแนะนำทั้งหมดจะมีความยาวคงที่ดังนั้นพีซีจึงสามารถเพิ่มขึ้นได้ด้วยจำนวนคงที่ สำหรับสถาปัตยกรรม CISC เช่น x86 คำสั่งอาจมีความยาวผันแปรได้ดังนั้นตรรกะที่ถอดรหัสคำสั่งจะต้องกำหนดระยะเวลาที่คำสั่งปัจจุบันจะค้นหาตำแหน่งของคำสั่งถัดไป
อย่างไรก็ตามสำหรับคำสั่งสาขาคำสั่งถัดไปที่จะดำเนินการไม่ใช่ตำแหน่งถัดไปหลังจากคำสั่งปัจจุบัน สาขาคือ gotos - พวกเขาบอกโปรเซสเซอร์ว่าคำสั่งถัดไปคืออะไร สาขาอาจเป็นแบบมีเงื่อนไขหรือไม่มีเงื่อนไขก็ได้และสถานที่เป้าหมายสามารถกำหนดหรือคำนวณได้
เงื่อนไขกับไม่มีเงื่อนไขเป็นเรื่องง่ายที่จะเข้าใจ - สาขาเงื่อนไขจะถูกนำมาใช้ก็ต่อเมื่อเงื่อนไขบางอย่างมีอยู่ (เช่นจำนวนหนึ่งเท่ากับอีกตัวหนึ่งหรือไม่) ถ้าสาขาไม่ได้รับการควบคุมจะดำเนินการตามคำสั่งถัดไปหลังจากสาขาเหมือนปกติ สำหรับสาขาที่ไม่มีเงื่อนไขจะใช้กิ่งก้านเสมอ สาขาที่มีเงื่อนไขแสดงในif
งบและการทดสอบการควบคุมของfor
และwhile
ลูป สาขาที่ไม่มีเงื่อนไขจะแสดงในลูปที่ไม่มีที่สิ้นสุดการเรียกใช้ฟังก์ชันการส่งคืนฟังก์ชันbreak
และcontinue
คำสั่งคำสั่งที่น่าอับอายgoto
และอื่น ๆ อีกมากมาย (รายการเหล่านี้ยังห่างไกลจากข้อมูลที่ครบถ้วนสมบูรณ์)
เป้าหมายของสาขาเป็นอีกเรื่องที่สำคัญ สาขาส่วนใหญ่มีเป้าหมายสาขาคงที่ - ไปยังตำแหน่งเฉพาะในรหัสที่กำหนดไว้ในเวลาคอมไพล์ ซึ่งรวมถึงif
คำสั่งการวนซ้ำทุกประเภทการเรียกใช้ฟังก์ชันปกติและอื่น ๆ อีกมากมาย คำนวณสาขาคำนวณกำหนดเป้าหมายของสาขาที่รันไทม์ ซึ่งรวมถึงswitch
คำสั่ง (บางครั้ง) การส่งคืนจากฟังก์ชันการเรียกฟังก์ชันเสมือนและการเรียกใช้ตัวชี้ฟังก์ชัน
ทั้งหมดนี้มีความหมายอย่างไรต่อประสิทธิภาพ? เมื่อโปรเซสเซอร์เห็นคำสั่งสาขาปรากฏในไปป์ไลน์จำเป็นต้องหาวิธีการเติมไปป์ไลน์ต่อไป เพื่อที่จะทราบว่าคำสั่งใดที่เกิดขึ้นหลังจากสาขาในสตรีมโปรแกรมจำเป็นต้องทราบสองสิ่ง: (1) หากสาขาจะถูกยึดและ (2) เป้าหมายของสาขา การหาสิ่งนี้เรียกว่าการทำนายแบบสาขาและเป็นปัญหาที่ท้าทาย หากโปรเซสเซอร์คาดเดาได้ถูกต้องโปรแกรมจะทำงานต่อไปด้วยความเร็วเต็มที่ หากโปรเซสเซอร์คาดเดาไม่ถูกต้องแสดงว่าใช้เวลาในการคำนวณสิ่งที่ผิด ตอนนี้ต้องล้างไปป์ไลน์และโหลดใหม่พร้อมคำแนะนำจากเส้นทางการดำเนินการที่ถูกต้อง บรรทัดล่าง: ผลงานยอดเยี่ยม
ดังนั้นเหตุผลที่ว่าทำไมถ้างบมีราคาแพงเป็นเพราะสาขา mispredictions นี่เป็นเพียงระดับต่ำสุด หากคุณกำลังเขียนโค้ดระดับสูงคุณไม่จำเป็นต้องกังวลเกี่ยวกับรายละเอียดเหล่านี้เลย คุณควรสนใจเรื่องนี้ก็ต่อเมื่อคุณกำลังเขียนโค้ดที่มีความสำคัญอย่างยิ่งต่อประสิทธิภาพใน C หรือแอสเซมบลี ในกรณีนี้การเขียนโค้ดแบบไม่แยกสาขามักจะดีกว่าโค้ดที่แตกกิ่งก้านแม้ว่าจะต้องมีคำสั่งเพิ่มเติมอีกหลายคำก็ตาม มีบางเทคนิคเด็ดบิต twiddling คุณสามารถทำได้เพื่อคำนวณสิ่งต่างๆเช่นมีabs()
, min()
และmax()
โดยไม่ต้องแยกทาง