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_setbiasanya dapat melacak hingga 1024 deskriptor file.
Cara paling efisien untuk melacak yang fdsditetapkan 0dan yang ditetapkan 1akan 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 nfdsadalah 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_SETSIZEdan __NFDBITSdari /usr/include/sys/select.huntuk 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, selectmengekspos detail implementasi sehingga bisa lebih cepat.