In "Advanced Programming in the UNIX Environment" beschreibt W. Richard Stevens dies als eine Leistungsoptimierung:
Durch die Angabe des höchsten Deskriptors, an dem wir interessiert sind, kann der Kernel vermeiden, Hunderte nicht verwendeter Bits in den drei Deskriptorsätzen zu durchlaufen und nach aktivierten Bits zu suchen.
(1. Auflage, Seite 399)
Wenn Sie UNIX-Systeme programmieren, wird das APUE-Buch dringend empfohlen.
AKTUALISIEREN
In der fd_setRegel können bis zu 1024 Dateideskriptoren verfolgt werden.
Der effizienteste Weg zu verfolgen, auf welchen fdseingestellt ist 0und auf welche eingestellt ist, 1wäre ein Bitsatz, also fd_setwürde jeder aus 1024 Bits bestehen.
Auf einem 32-Bit - System, ein long int (oder "Wort") beträgt 32 Bits, so dass jeder daß Mittel fd_setist
1024/32 = 32 Worte.
Wenn nfdses sich bei etwas Kleinem wie 8 oder 16 handelt, wie es in vielen Anwendungen der Fall ist, muss nur das erste Wort gesucht werden, was eindeutig schneller sein sollte als alle 32.
(Siehe FD_SETSIZEund __NFDBITSvon /usr/include/sys/select.hfür die Werte auf Ihrer Plattform.)
UPDATE 2
Warum ist die Funktionssignatur nicht
int select(fd_set *readfds, int nreadfds,
fd_set *writefds, int nwritefds,
fd_set *exceptfds, int nexceptfds,
struct timeval *timeout);
Ich vermute, es liegt daran, dass der Code versucht, alle Argumente in Registern zu speichern , damit die CPU schneller mit ihnen arbeiten kann. Wenn zwei zusätzliche Variablen nachverfolgt werden müssten, verfügt die CPU möglicherweise nicht über genügend Register.
Mit anderen Worten, selectwird ein Implementierungsdetail verfügbar gemacht, damit es schneller sein kann.