Ответ 1
Это имеет смысл, если вы ищете ep_find
. Я провел всего несколько минут, и я вижу, что ep_find
вызывается только epoll_ctl
.
Итак, когда вы добавляете дескрипторы (EPOLL_CTL_ADD
), выполняется дорогостоящая операция. НО при выполнении реальной работы (epoll_wait
) это не так. Вы добавляете только дескрипторы в начале.
В заключение этого недостаточно спросить о сложности epoll
, так как нет системного вызова epoll
. Вам нужны индивидуальные сложности epoll_ctl
, epoll_wait
и т.д.
Другие вещи
Есть другие причины, чтобы избежать select
и использовать epoll
. При использовании select вы не знаете, сколько дескрипторов требует внимания. Поэтому вы должны следить за самой большой и петлей.
rc = select(...);
/* check rc */
for (s = 0; s <= maxfd; s++) {
if (FD_ISSET(s)) {
/* ... */
}
}
Теперь с epoll
это намного чище:
nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
/* check nfds */
for (n = 0; n < nfds; ++n) {
/* events[n].data.fd needs attention */
}