while (condition) {
...
}
เวิร์กโฟลว์:
- ตรวจสอบสภาพ;
- ถ้าเป็นเท็จให้ข้ามไปที่ด้านนอกของลูป
- เรียกใช้การวนซ้ำหนึ่งครั้ง
- ข้ามไปด้านบน
if (condition) do {
...
} while (condition);
เวิร์กโฟลว์:
- ตรวจสอบสภาพ;
- ถ้าเป็นเท็จให้ข้ามไปที่ด้านนอกลูป
- เรียกใช้การวนซ้ำหนึ่งครั้ง
- ตรวจสอบสภาพ;
- ถ้าเป็นจริงข้ามไปยังขั้นตอนที่ 3
การเปรียบเทียบทั้งสองนี้คุณจะเห็นได้อย่างง่ายดายว่าการกระโดดครั้งหลังอาจไม่ได้ทำการกระโดดใด ๆ เลยโดยมีเงื่อนไขว่ามีขั้นตอนเดียวในการวนซ้ำและโดยทั่วไปจำนวนการกระโดดจะน้อยกว่าจำนวนการวนซ้ำหนึ่งครั้ง อดีตจะต้องย้อนกลับไปเพื่อตรวจสอบเงื่อนไขเพียงเพื่อกระโดดออกจากลูปเมื่อเงื่อนไขเป็นเท็จ
การกระโดดบนสถาปัตยกรรมซีพียูแบบไปป์ไลน์ที่ทันสมัยอาจมีราคาค่อนข้างแพงเนื่องจากซีพียูกำลังดำเนินการตรวจสอบให้เสร็จสิ้นก่อนที่จะกระโดดคำแนะนำนอกเหนือจากการกระโดดนั้นจึงอยู่ตรงกลางของท่อแล้ว ต้องยกเลิกการประมวลผลทั้งหมดนี้หากการคาดคะเนสาขาล้มเหลว การดำเนินการเพิ่มเติมล่าช้าในขณะที่ท่อกำลังถูกตำหนิ
การอธิบายการทำนายสาขาที่กล่าวถึง: สำหรับการกระโดดแบบมีเงื่อนไขแต่ละประเภท CPU จะมีคำสั่งสองคำสั่งแต่ละคำสั่งรวมถึงการเดิมพันผลลัพธ์ ตัวอย่างเช่นคุณจะใส่คำสั่งว่า " jump if not zero, bet on not zero " ที่ตอนท้ายของลูปเพราะการกระโดดจะต้องทำซ้ำทั้งหมดยกเว้นครั้งสุดท้าย ด้วยวิธีนี้ซีพียูจะเริ่มสูบไปป์ไลน์โดยทำตามคำแนะนำตามเป้าหมายการกระโดดแทนที่จะเป็นตามคำสั่งกระโดด
โน๊ตสำคัญ
กรุณาอย่าไม่ใช้เวลานี้เป็นตัวอย่างของวิธีการที่จะเพิ่มประสิทธิภาพในระดับรหัสที่มาที่ นั่นจะเป็นการเข้าใจผิดอย่างสิ้นเชิงเนื่องจากตามที่ชัดเจนแล้วจากคำถามของคุณการเปลี่ยนแปลงจากรูปแบบแรกเป็นรูปแบบที่สองเป็นสิ่งที่คอมไพเลอร์ JIT ทำตามกิจวัตรประจำวันโดยสมบูรณ์ด้วยตัวมันเอง