Trong "Lập trình nâng cao trong môi trường UNIX" , W. Richard Stevens nói rằng đó là một tối ưu hóa hiệu suất:
Bằng cách chỉ định bộ mô tả cao nhất mà chúng tôi quan tâm, hạt nhân có thể tránh được hàng trăm bit không sử dụng trong ba bộ mô tả, tìm kiếm các bit được bật.
(Ấn bản 1, trang 399)
Nếu bạn đang thực hiện bất kỳ loại lập trình hệ thống UNIX nào, sách APUE rất được khuyến khích.
CẬP NHẬT
An fd_set
thường có thể theo dõi tới 1024 bộ mô tả tệp.
Cách hiệu quả nhất để theo dõi cái nào fds
được đặt 0
và được đặt thành 1
sẽ là một bitet, vì vậy mỗi cái fd_set
sẽ bao gồm 1024 bit.
Trên hệ thống 32 bit, một int dài (hoặc "từ") là 32 bit, do đó, có nghĩa là mỗi bit fd_set
là
1024/32 = 32 từ.
Nếu nfds
là một cái gì đó nhỏ, chẳng hạn như 8 hoặc 16, có trong nhiều ứng dụng, nó chỉ cần nhìn vào từ thứ 1, rõ ràng sẽ nhanh hơn so với nhìn vào bên trong tất cả 32.
(Xem FD_SETSIZE
và __NFDBITS
từ /usr/include/sys/select.h
các giá trị trên nền tảng của bạn.)
CẬP NHẬT 2
Tại sao chữ ký hàm không
int select(fd_set *readfds, int nreadfds,
fd_set *writefds, int nwritefds,
fd_set *exceptfds, int nexceptfds,
struct timeval *timeout);
Tôi đoán là bởi vì mã cố gắng giữ tất cả các đối số trong các thanh ghi , vì vậy CPU có thể hoạt động trên chúng nhanh hơn và nếu nó phải theo dõi thêm 2 biến, CPU có thể không có đủ các thanh ghi.
Vì vậy, nói cách khác, select
đang phơi bày một chi tiết thực hiện để nó có thể nhanh hơn.