Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Toán tử < có nhanh hơn <= trong C/C++ không?

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 / jzEqual / ZeroZF = 1
jne / jnzNot Equal / Not ZeroZF = 0
jg / jnleGreater (signed)ZF = 0 và SF = OF
jge / jnlGreater or Equal (signed)SF = OF
jl / jngeLess (signed)SF != OF
jle / jngLess or Equal (signed)ZF = 1 hoặc SF != OF
ja / jnbeAbove (unsigned)CF = 0 và ZF = 0
jae / jnbAbove or Equal (unsigned)CF = 0
jb / jnaeBelow (unsigned)CF = 1
jbe / jnaBelow 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.