Существуют ли некоторые простые правила, когда использовать poll
vs. epoll
в среде с низкой задержкой? epoll
должен иметь более высокие накладные расходы, если отслеживается только небольшое количество файловых дескрипторов. Пожалуйста, дайте некоторое представление, ответы "проверьте это сами", в другом месте.
Опрос против epoll insight
Ответ 1
Всегда используйте poll
, если не выполняются все следующие условия:
- Вы можете убедиться, что находитесь в системе (Linux), которая имеет
epoll
или вы предоставляете резервную копию для систем, которые этого не делают. - У вас есть огромный число дескрипторов файлов (не менее 1000-10000).
- Набор файловых дескрипторов, с которыми вы работаете, стабилен в течение длительного периода времени (добавление/удаление дескрипторов файлов из списка
epoll
столь же дорого, как и операцияpoll
, так как для этого требуется ввести/оставить kernelspace).
Ответ 2
Прежде всего, poll(2)
запускается только по уровню, но epoll(4)
может использоваться как интерфейс с граничным или уровнем.
Теперь сложность: poll
сложность относительно количества просмотренных дескрипторов (fds) - это O (n), когда он сканирует все fds каждый раз, когда происходит "готовое" событие, epoll
в основном O (1), поскольку он не выполняет линейное сканирование по всем наблюдаемым дескрипторам.
В терминах переносимости - поскольку epoll
является специфичным для Linux, я бы предложил проверить libev и libevent.
Кроме того, ознакомьтесь с замечательной записью Дэна Кегеля: " Проблема C10K".
Ответ 3
epoll(7)
кратко суммирует его: epoll
"хорошо масштабируется для большого количества просмотренных файловых дескрипторов". Однако poll
является стандартным интерфейсом POSIX, поэтому используйте его, когда требуется переносимость.