维基百科说
与旧的系统调用不同 在O(n)运营,epoll运营于 O(1)[2])。
http://en.wikipedia.org/wiki/Epoll
然而,Linux-2.6.38上fs / eventpoll.c的源代码, 似乎用RB树实现搜索,它有O(logN)
/*
* Search the file inside the eventpoll tree. The RB tree operations
* are protected by the "mtx" mutex, and ep_find() must be called with
* "mtx" held.
*/
static struct epitem *ep_find(struct eventpoll *ep, struct file *file, int fd)
{
事实上,我看不到任何手册页说epoll()的复杂性是O(1)。 为什么称为O(1)?
答案 0 :(得分:24)
一旦你找到ep_find
,这是有道理的。我只花了几分钟时间,我看到ep_find
仅由epoll_ctl
调用。
确实,当您添加描述符(EPOLL_CTL_ADD
)时,执行昂贵的操作。但是当做实际工作(epoll_wait
)时却不然。您只需在开头添加描述符。
总之,仅仅询问epoll
的复杂性是不够的,因为没有epoll
系统调用。您需要epoll_ctl
,epoll_wait
等个别复杂性。
还有其他原因可以避免select
并使用epoll
。使用select时,您不知道需要注意多少描述符。所以你必须跟踪最大的并循环到它。
rc = select(...);
/* check rc */
for (s = 0; s <= maxfd; s++) {
if (FD_ISSET(s)) {
/* ... */
}
}
现在epoll
更清洁:
nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
/* check nfds */
for (n = 0; n < nfds; ++n) {
/* events[n].data.fd needs attention */
}