Существуют ли некоторые простые правила, когда использовать 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, поэтому используйте его, когда требуется переносимость.