2013-12-07 4 views
3

Я думал, что epoll должен быть быстрее, чем poll, но когда я делаю следующий эксперимент, он оказывается медленнее.Почему `poll.poll` быстрее, чем` epoll.poll`?

Сначала я установил 1 серверный сокет с 10 подключенными к нему сокетами.

import socket 
server = socket.socket() 
server.bind(('127.0.0.1', 7777)) 
server.listen(1) 

clients = [socket.socket() for i in range(10)] 
for c in clients: 
    c.connect(('127.0.0.1', 7777)) 

Тогда я зарегистрировал всех клиентов как с poll и epoll:

import select 
ep = select.epoll() 
p = select.poll() 
for c in clients: 
    p.register(c) 
    ep.register(c) 

Наконец я использую %timeit в IPython сравнить время выполнения:

%timeit p.poll() 
1000000 loops, best of 3: 1.26 us per loop 
%timeit ep.poll() 
1000000 loops, best of 3: 1.7 us per loop 

Может быть, количество сокетов еще слишком мал для epoll, чтобы побить poll, но мне интересно что находится в epoll, что делает его медленнее, когда не так много наблюдаемых сокетов.

ответ

0

Системный вызов опроса должен каждый раз копировать список файловых дескрипторов в ядро. Это происходит только один раз с epoll_ctl, но не каждый раз, когда вы вызываете epoll_wait.

Кроме того, epoll_wait - это O (1) в отношении количества дескрипторов, просмотренных1, что означает, что неважно, будете ли вы ждать одного дескриптора или дескрипторов 5000 или 50 000. опрос, хотя он более эффективен, чем выбор, все равно приходится каждый раз перебирать список (т. е. O (N) в отношении количества дескрипторов).

И, наконец, epoll может в дополнение к «нормальному» режиму работать в режиме «edge triggered», что означает, что ядру не нужно отслеживать, сколько данных вы прочитали после того, как вы указали готовность. Этот режим сложнее понять, но несколько более эффективен.

+0

Так что 'epoll' должен быть быстрее, не так ли? Как получилось, что в эксперименте это было медленнее? – satoru

+0

Нет опроса быстрее из моего опыта работы с ним – Jordanian

+0

Тогда реализация «epoll» O (1) должна иметь большую константу 'C'. – satoru

Смежные вопросы