gpt4 book ai didi

python - 为什么 `poll.poll` 比 `epoll.poll` 快?

转载 作者:太空狗 更新时间:2023-10-29 11:22:21 28 4
gpt4 key购买 nike

我原以为 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))

然后我用 pollepoll 注册了所有客户端:

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

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

%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 中有什么让它在观看的套接字不多。

最佳答案

轮询系统调用每次都需要将您的文件描述符列表复制到内核。这种情况只会在 epoll_ctl 中发生一次,但不会在您每次调用 epoll_wait 时发生。

此外,epoll_wait 就监视的描述符数量而言是 O(1)1,这意味着您是等待一个描述符还是等待 5,000 或 50,000 个描述符并不重要。 poll,虽然比 select 更有效,但每次仍然需要遍历列表(即,就描述符的数量而言,它是 O(N))。

最后,除了“正常”模式外,epoll 还可以在“边沿触发”模式下工作,这意味着内核在收到准备就绪信号后不需要跟踪您读取了多少数据。这种模式更难掌握,但效率更高。

关于python - 为什么 `poll.poll` 比 `epoll.poll` 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20436410/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com