Dalam "Pemrograman Tingkat Lanjut di Lingkungan UNIX" , W. Richard Stevens mengatakan ini adalah pengoptimalan kinerja:
Dengan menentukan deskriptor tertinggi yang kami minati, kernel dapat menghindari melalui ratusan bit yang tidak digunakan dalam tiga set deskriptor, mencari bit yang dihidupkan.
(Edisi 1, halaman 399)
Jika Anda melakukan segala jenis pemrograman sistem UNIX, buku APUE sangat dianjurkan.
MEMPERBARUI
An fd_set
biasanya dapat melacak hingga 1024 deskriptor file.
Cara paling efisien untuk melacak yang fds
ditetapkan 0
dan yang ditetapkan 1
akan berupa bitset, sehingga masing fd_set
- masing terdiri dari 1024 bit.
Pada sistem 32-bit, int panjang (atau "kata") adalah 32 bit, sehingga artinya masing fd_set
- masing adalah
1024/32 = 32 kata.
Jika itu nfds
adalah sesuatu yang kecil, seperti 8 atau 16, yang akan ada di banyak aplikasi, hanya perlu melihat ke dalam kata 1, yang jelas harus lebih cepat daripada melihat ke dalam semua 32.
(Lihat FD_SETSIZE
dan __NFDBITS
dari /usr/include/sys/select.h
untuk nilai pada platform Anda.)
PEMBARUAN 2
Mengapa fungsi tanda tangan tidak
int select(fd_set *readfds, int nreadfds,
fd_set *writefds, int nwritefds,
fd_set *exceptfds, int nexceptfds,
struct timeval *timeout);
Dugaan saya adalah karena kode mencoba menyimpan semua argumen dalam register , sehingga CPU dapat bekerja lebih cepat, dan jika harus melacak 2 variabel tambahan, CPU mungkin tidak memiliki cukup register.
Jadi dengan kata lain, select
mengekspos detail implementasi sehingga bisa lebih cepat.