首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么`poll.poll`比`epoll.poll`快?

为什么`poll.poll`比`epoll.poll`快?
EN

Stack Overflow用户
提问于 2013-12-07 09:24:25
回答 1查看 383关注 0票数 3

我认为epoll应该比poll更快,但当我做下面的实验时,它被证明更慢。

首先,我设置了1个服务器套接字和10个客户端套接字。

代码语言:javascript
复制
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))

然后,我向pollepoll注册了所有客户端

代码语言:javascript
复制
import select
ep = select.epoll()
p = select.poll()
for c in clients:
    p.register(c)
    ep.register(c)

最后,我在IPython中使用%timeit来比较运行时:

代码语言:javascript
复制
%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中有什么东西让它在没有太多套接字被监视的情况下变得更慢。

EN

回答 1

Stack Overflow用户

发布于 2013-12-18 03:40:33

每次轮询系统调用都需要将文件描述符列表复制到内核。对于epoll_ctl,这只会发生一次,但不是每次调用epoll_wait时都会发生。

此外,关于描述符watched1的数量,epoll_wait是O(1),这意味着您是等待一个描述符,还是等待5,000或50,000个描述符。尽管轮询比select效率更高,但每次仍然必须遍历列表(即,就描述符的数量而言,它是O(N) )。

最后,除了“正常”模式之外,epoll还可以在“边缘触发”模式下工作,这意味着内核不需要跟踪您在收到就绪信号后已经读取了多少数据。这种模式更难掌握,但在某种程度上更有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20436410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档