ใน"การเขียนโปรแกรมขั้นสูงในสภาพแวดล้อม UNIX" W. Richard Stevens กล่าวว่าเป็นการเพิ่มประสิทธิภาพ:
ด้วยการระบุตัวอธิบายสูงสุดที่เราสนใจเคอร์เนลสามารถหลีกเลี่ยงการผ่านบิตที่ไม่ได้ใช้หลายร้อยบิตในชุดตัวอธิบายทั้งสามโดยมองหาบิตที่เปิดใช้งาน
(ฉบับที่ 1 หน้า 399)
หากคุณกำลังทำการเขียนโปรแกรมระบบ UNIX ชนิดใด ๆ แนะนำให้ใช้หนังสือ APUE
UPDATE
โดยfd_set
ทั่วไปแล้วสามารถติดตามตัวอธิบายไฟล์ได้สูงสุด 1024 ตัว
วิธีที่มีประสิทธิภาพที่สุดในการติดตามว่าfds
มีการตั้งค่าไว้ที่ใด0
และถูกตั้งค่า1
เป็นfd_set
บิตเซ็ตดังนั้นแต่ละอันประกอบด้วย 1024 บิต
บนระบบ 32 บิต int ที่มีความยาว (หรือ "คำว่า") คือ 32 บิตดังนั้นนั่นหมายความว่าแต่ละคำfd_set
คือ
1024/32 = 32 คำ
หากnfds
มีบางสิ่งเล็ก ๆ เช่น 8 หรือ 16 ซึ่งจะมีอยู่ในแอปพลิเคชั่นจำนวนมากจะต้องมองเข้าไปในคำที่ 1 เท่านั้นซึ่งควรจะเร็วกว่าการมองเข้าไปข้างในทั้ง 32
(ดูFD_SETSIZE
และ__NFDBITS
จาก/usr/include/sys/select.h
สำหรับค่าบนแพลตฟอร์มของคุณ)
อัพเดท 2
ว่าทำไมลายเซ็นฟังก์ชั่นไม่ได้
int select(fd_set *readfds, int nreadfds,
fd_set *writefds, int nwritefds,
fd_set *exceptfds, int nexceptfds,
struct timeval *timeout);
ฉันเดาว่าเป็นเพราะรหัสพยายามเก็บอาร์กิวเมนต์ทั้งหมดในการลงทะเบียนเพื่อให้ CPU สามารถทำงานกับพวกเขาได้เร็วขึ้นและหากต้องติดตามตัวแปรเพิ่มเติม 2 ตัว CPU อาจมีการลงทะเบียนไม่เพียงพอ
ดังนั้นในคำอื่น ๆselect
คือการเปิดเผยรายละเอียดการดำเนินการเพื่อให้สามารถเร็วขึ้น