Это имеет смысл, когда вы ищете 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 */
}