while (condition) {
...
}
Quy trình làm việc:
- Kiểm tra tình trạng;
- nếu sai, nhảy ra bên ngoài vòng lặp;
- chạy một lần lặp lại;
- nhảy lên đầu.
if (condition) do {
...
} while (condition);
Quy trình làm việc:
- Kiểm tra tình trạng;
- nếu sai, nhảy ra ngoài vòng lặp;
- chạy một lần lặp lại;
- Kiểm tra tình trạng;
- nếu đúng, hãy chuyển sang bước 3.
So sánh hai bước này, bạn có thể dễ dàng thấy rằng bước sau có thể không thực hiện bất kỳ bước nhảy nào, miễn là có chính xác một bước trong vòng lặp và nói chung số lần nhảy sẽ ít hơn một lần so với số lần lặp. Đầu tiên sẽ phải quay lại để kiểm tra điều kiện, chỉ nhảy ra khỏi vòng lặp khi điều kiện sai.
Các bước nhảy trên các kiến trúc CPU có đường ống hiện đại có thể khá tốn kém: vì CPU đang hoàn thành việc thực hiện các kiểm tra trước khi bước nhảy, các lệnh vượt quá bước nhảy đó đã ở giữa đường dẫn. Tất cả quá trình xử lý này phải bị loại bỏ nếu dự đoán nhánh không thành công. Quá trình thực thi tiếp tục bị trì hoãn trong khi đường ống đang được lặp lại.
Giải thích cho dự đoán nhánh đã đề cập : đối với mỗi loại bước nhảy có điều kiện, CPU có hai lệnh, mỗi lệnh bao gồm đặt cược vào kết quả. Ví dụ: bạn sẽ đặt một chỉ dẫn nói rằng " nhảy nếu không, đặt cược vào không " ở cuối vòng lặp vì bước nhảy sẽ phải được thực hiện trên tất cả các lần lặp ngoại trừ lần cuối cùng. Bằng cách đó, CPU bắt đầu bơm đường ống của nó với các lệnh theo sau mục tiêu bước nhảy thay vì các lệnh theo chính lệnh nhảy.
Lưu ý quan trọng
Vui lòng không lấy đây làm ví dụ về cách tối ưu hóa ở cấp mã nguồn. Điều đó sẽ hoàn toàn sai lầm vì, như câu hỏi của bạn đã rõ ràng, việc chuyển đổi từ dạng đầu tiên thành dạng thứ hai là điều mà trình biên dịch JIT thực hiện như một vấn đề thường lệ, hoàn toàn tự nó.