Không. Cả < và <= thực thi trong cùng thời gian trên mọi kiến trúc CPU hiện đại.
Tại sao người ta nghĩ khác?
Quan niệm sai lầm từ thời CPU rất cũ (16-bit, không pipeline) nơi so sánh phức tạp hơn có thể tốn thêm chu kỳ. Ngày nay hoàn toàn khác.
Cấp độ máy (Assembly x86-64)
; a < b cmp eax, ebx jl label_less ; Jump if Less (SF != OF) ; a <= b cmp eax, ebx jle label_less_eq ; Jump if Less or Equal (ZF=1 or SF!=OF)
Cả jl và jle là một instruction đơn, cùng latency (1 cycle), cùng throughput. Branch predictor xử lý giống hệt nhau.
Các lệnh jump so sánh (x86)
| Mnemonic | Ý nghĩa | Điều kiện flag |
|---|---|---|
| je / jz | Equal / Zero | ZF = 1 |
| jne / jnz | Not Equal / Not Zero | ZF = 0 |
| jg / jnle | Greater (signed) | ZF = 0 và SF = OF |
| jge / jnl | Greater or Equal (signed) | SF = OF |
| jl / jnge | Less (signed) | SF != OF |
| jle / jng | Less or Equal (signed) | ZF = 1 hoặc SF != OF |
| ja / jnbe | Above (unsigned) | CF = 0 và ZF = 0 |
| jae / jnb | Above or Equal (unsigned) | CF = 0 |
| jb / jnae | Below (unsigned) | CF = 1 |
| jbe / jna | Below or Equal (unsigned) | CF = 1 hoặc ZF = 1 |
Ví dụ C
#include <stdio.h>
int main() {
int a = 8, b = 8;
if (a < b)
printf("b lớn hơn a\n");
if (a <= b)
printf("b lớn hơn hoặc bằng a\n");
else
printf("b nhỏ hơn a\n");
return 0;
}
Kết quả
b lớn hơn hoặc bằng a
Khi nào có chênh lệch?
- Không bao giờ về instruction count/cycle trên CPU hiện đại (x86, ARM, RISC-V)
- Compiler có thể biến đổi:
a <= b→!(b < a)(tối ưu logic) - Chênh lệch chỉ xuất hiện nếu: code không tối ưu (-O0), architecture rất cũ, hoặc microbenchmark kém thiết kế
Kết luận
Dùng toán tử nào **phù hợp logic nghiệp vụ** nhất. Đọc code dễ hiểu quan trọng hơn micro-optimization vô nghĩa này. Compiler sẽ sinh code tối ưu như nhau.