Số lượng hướng dẫn bạn viết trong mã nguồn không liên quan chặt chẽ đến số lượng lệnh máy mà trình biên dịch sẽ tạo ra.
Hầu hết các trình biên dịch thông minh hơn và trong ví dụ thứ hai của bạn có thể tạo mã như:
operation();
operation();
operation();
operation();
operation();
tự động vì họ phát hiện rằng vòng lặp sẽ luôn lặp 5 lần.
Ngoài ra nếu bạn làm một tối ưu hóa hồ sơ theo định hướng và một trình biên dịch thấy rằng một vòng lặp có tí hon một cơ thể và lặp lại rất cao đếm nó có thể cuộn nó ngay cả đối với một số chung của sự lặp lại với các mã như:
while (count >= 5) {
operation();
operation();
operation();
operation();
operation();
count -= 5;
}
while (count > 0) {
operation();
count--;
}
Điều này sẽ làm cho số lượng lớn count
s khoảng một phần năm số lần kiểm tra so với phiên bản ngây thơ.
Nếu điều này đáng làm hoặc không phải là điều gì đó mà chỉ có hồ sơ mới có thể cho biết.
Một điều bạn có thể làm gì nếu bạn biết chắc chắn rằng mã cần phải được thực hiện ít nhất một lần là viết
do {
operation();
} while (--count);
thay vì
while (count--) {
operation();
}
Khả năng count==0
là hơi khó chịu cho CPU vì yêu cầu trong mã do hầu hết các trình biên dịch tạo ra thêm một JMP về phía trước:
jmp test
loop:
...operation...
test:
...do the test...
jne loop
.210
mã máy cho phiên bản do { ... } while
thay vì chỉ đơn giản là
loop:
... opertion ...
... do the test...
jne loop
Đó không phải là điều bạn nên làm. Trình biên dịch của bạn đã hủy bỏ vòng lặp nếu nó hiệu quả hơn. – ThiefMaster
Tại sao bạn muốn làm điều đó? Nó sẽ chiếm nhiều không gian hơn trong bộ nhớ cache lệnh, yêu cầu giải mã lệnh nhiều hơn và về cơ bản sẽ tồi tệ hơn. Nếu nó tốt hơn, trình biên dịch có chuyển đổi nó cho bạn không? (Trừ khi nó là một mảnh rác, trong trường hợp này tại sao bạn sử dụng nó?) –