Системный вызов poll должен каждый раз копировать ваш список файловых дескрипторов в ядро. Это происходит только один раз с epoll_ctl
, но не каждый раз, когда вы звоните epoll_wait
.
Кроме того, epoll_wait
равно O(1)
в отношении количества просмотренных дескрипторов 1 , что означает, что не имеет значения, ожидаете ли вы один дескриптор или 5000 или 50 000 дескрипторов. poll
, будучи более эффективным, чем select
, все равно должен каждый раз проходить по списку (то есть O(N)
в отношении количества дескрипторов).
И, наконец, epoll может, в дополнение к «нормальному» режиму, работать в режиме «запуска по фронту», что означает, что ядру не нужно отслеживать, сколько данных вы прочитали после того, как вам сообщили о готовности. Этот режим труднее понять, но несколько эффективнее.
<ч />
1 Как правильно указал Дэвид Шварц, epoll_wait
, конечно, все еще O(N)
в отношении событий, которые происходят . Едва ли может быть иначе, с любым интерфейсом. Если в отслеживаемом дескрипторе происходят события N , то приложению необходимо получать N уведомлений и делать N «вещей» для реакции о том, что происходит.
Это снова немного, но принципиально не отличается в режиме запуска по фронту, где вы на самом деле получаете M
событий с M <= N
. В режиме запуска по фронту, когда одно и то же событие (скажем, POLLIN
) происходит несколько раз, вы, вероятно, получите меньше уведомлений, возможно, только одно. Однако это не сильно меняет представление о биг-О как таковом.
Однако epoll_wait
не зависит от количества просмотренных дескрипторов . В предположении, что он используется намеченным, «нормальным» способом (то есть многими дескрипторами, немногими событиями), это то, что действительно имеет значение, и здесь это действительно O(1)
.
В качестве аналогии вы можете подумать о хеш-таблице. Хеш-таблица обращается к своему содержимому в O(1)
, но можно утверждать, что вычисление хеша на самом деле O(N)
в отношении длины ключа. Технически это абсолютно правильно, и, вероятно, существуют случаи, когда это является проблемой, однако для большинства людей это просто не имеет значения.