Pour un très petit nombre de sockets (varie en fonction de votre matériel, bien sûr, mais nous parlons de quelque chose de l'ordre de 10 ou moins), sélectionnez pouvez battre epoll dans l'utilisation de la mémoire et de la vitesse d'exécution. Bien sûr, pour un tel petit nombre de sockets, les deux mécanismes sont si rapides que vous n'avez pas vraiment au sujet de cette différence dans la très grande majorité des cas.
Une précision, cependant. Sélectionnez et epoll à l'échelle linéaire. Une grande différence, cependant, est que l'utilisateur face à des Api ont des complexités qui sont basées sur des choses différentes. Le coût d'un select
appel va à peu près avec la valeur de la plus haute numérotés fichier descripteur de vous le transmettre. Si vous sélectionnez un seul fd, 100, alors que c'est à peu près deux fois plus cher que la sélection sur un seul fd, 50. Ajout de plus de fds en dessous du plus haut n'est pas tout à fait libre, donc c'est un peu plus compliqué que cela, dans la pratique, mais c'est une bonne première approximation pour la plupart des implémentations.
Le coût de epoll est plus proche du nombre de descripteurs de fichiers qui ont réellement des événements sur eux. Si vous êtes à la surveillance de 200 descripteurs de fichiers, mais seulement 100 d'entre eux ont des événements sur eux, alors vous êtes (très grossièrement) en ne payant que pour ceux de 100 active des descripteurs de fichiers. C'est là que epoll tend à offrir à l'un de ses principaux avantages par rapport à sélectionner. Si vous avez un millier de clients qui sont pour la plupart inactif, puis lorsque vous utilisez select vous êtes encore payer pour tous d'un millier d'entre eux. Cependant, avec epoll, c'est comme si vous avez seulement quelques - unes, vous êtes de ne payer que pour ceux qui sont actifs à un moment donné.
Tout cela signifie que epoll va conduire à réduire l'utilisation du PROCESSEUR pour la plupart des charges de travail. Aussi loin que l'utilisation de la mémoire va, c'est un peu un tirage au sort. select
ne parviennent à représenter toutes les informations nécessaires dans un très compacte (un bit par descripteur de fichier). Et le FD_SETSIZE (généralement 1024) limitation du nombre de descripteurs de fichiers, vous pouvez utiliser select
signifie que vous ne serez jamais passer plus de 128 octets pour chacun des trois fd jeux que vous pouvez utiliser avec select
(à lire, à écrire, à l'exception). Par rapport à ceux de 384 octets max, epoll est une sorte de cochon. Chaque descripteur de fichier est représenté par un multi-octets de la structure. Toutefois, en termes absolus, c'est toujours pas utiliser trop de mémoire. Vous pouvez représenter un grand nombre de descripteurs de fichiers en quelques dizaines de kilo-octets (environ 20k par 1000 les descripteurs de fichier, je pense). Et vous pouvez également jeter dans le fait que vous avez à dépenser de tous les 384 de ces octets avec select
si vous ne souhaitez surveiller un descripteur de fichier, mais que sa valeur se passe en 1024, wheras avec epoll (vous ne dépenser 20 octets. Encore, tous ces chiffres sont assez petits, de sorte qu'il n'a pas beaucoup de différence.
Et il y a aussi d'autres avantages de epoll, qui peut-être vous êtes déjà au courant, qu'il n'est pas limité à FD_SETSIZE les descripteurs de fichier. Vous pouvez l'utiliser pour surveiller autant de descripteurs de fichiers que vous avez. Et si vous avez seulement un descripteur de fichier, mais sa valeur est supérieure à FD_SETSIZE, epoll fonctionne aussi, mais select
ne le sont pas.
Au hasard, j'ai découvert récemment un léger inconvénient d' epoll
par rapport à l' select
ou poll
. Bien qu'aucun de ces trois Api prend en charge les fichiers normaux (c'est à dire, de fichiers sur un système de fichiers) select
et poll
présenter ce manque de soutien que les rapports de ces descripteurs comme toujours lisible et toujours accessible en écriture. Cela les rend impropres à quelle sorte de non-blocage du système de fichiers I/O, un programme qui utilise select
ou poll
, et qui rencontre un descripteur de fichier du système de fichiers permettra au moins de continuer à fonctionner (ou si elle échoue, elle ne sera pas à cause de l' select
ou poll
), quoique peut-être pas avec les meilleures performances.
D'autre part, epoll
échouent rapide avec une erreur (EPERM
, apparemment, lorsqu'on lui a demandé de surveiller un tel descripteur de fichier. Strictement parlant, ce n'est pas incorrect. C'est simplement signe de son manque de soutien d'une manière explicite. Normalement, je devrais applaudir explicite les conditions d'échec, mais celui-ci est sans-papiers (pour autant que je puisse dire) et les résultats dans un complètement brisé application, plutôt que de simplement fonctionne avec potentiellement une dégradation des performances.
Dans la pratique, le seul endroit que j'ai vu c'est lors de l'interaction avec stdio. Un utilisateur peut rediriger stdin ou stdout partir de/vers un fichier normal. Alors qu'auparavant, stdin et stdout aurait été un tube, appuyée par epoll juste des beaux -- il devient alors un fichier normal et epoll ne parvient pas à haute voix, casser l'application.