C++ poll vs.epoll insight

C++ poll vs.epoll insight,c++,c,linux,gcc,C++,C,Linux,Gcc,在低延迟环境中使用poll和epoll时,是否有一些简单的经验法则epoll应具有更高的开销。请给出一些见解,回答放在别处的“自己检查”问题。epoll(7)对其进行了简洁的总结:epoll“可以很好地扩展到大量受关注的文件描述符。”然而,poll是POSIX标准接口,所以在需要可移植性时使用它。首先,poll(2)仅为电平触发,但epoll(4)可用作边缘或电平触发接口 现在复杂性:poll关于关注描述符(FD)数量的复杂性为O(n),因为它在每次“就绪”事件发生时扫描所有FD,epoll基本

在低延迟环境中使用
poll
epoll
时,是否有一些简单的经验法则<如果只监视很少的文件描述符,则code>epoll应具有更高的开销。请给出一些见解,回答放在别处的“自己检查”问题。

epoll(7)
对其进行了简洁的总结:
epoll
“可以很好地扩展到大量受关注的文件描述符。”然而,
poll
是POSIX标准接口,所以在需要可移植性时使用它。

首先,
poll(2)
仅为电平触发,但
epoll(4)
可用作边缘或电平触发接口

现在复杂性:
poll
关于关注描述符(FD)数量的复杂性为O(n),因为它在每次“就绪”事件发生时扫描所有FD,
epoll
基本上为O(1),因为它不会对所有关注的描述符进行线性扫描

在可移植性方面-由于epoll是Linux特有的,我建议您签出和使用库。
此外,请查看Dan Kegel的优秀写作:“。

除非满足以下所有条件,否则始终使用
投票:

  • 您可以确保您所使用的(Linux)系统具有
    epoll
    ,或者为不具有epoll的系统提供备用
  • 您有大量活动的文件描述符(至少1000-10000)
  • 您正在使用的文件描述符集在很长一段时间内是稳定的(从
    epoll
    列表中添加/删除文件描述符与
    poll
    操作一样昂贵,因为它需要输入/离开kernelspace)

  • 是的,它可以扩展,但是如果FD的数量很小,
    poll
    应该更快。@James:我真的很想看看关于这方面的一些基准测试。根据我个人的经验,我想说,如果你做了一些事情作为对事件的反应,这没有多大区别。考虑到您必须自己维护poll向量,我甚至可以猜测epoll更快。重要的区别是,正如在这个答案中所述,poll是POSIX的,因此更便于移植。epoll还具有提供更多功能的优势。我相信关于epoll和大O表示法的要点并不在于这两个函数的内部,所以说“轮询扫描所有描述符,而epoll不扫描”是不正确的。它们都可能在单个事件中触发。但是,使用poll时,用户别无选择,只能遍历提交的整个列表以查找事件,而使用epoll则会返回一个仅包含实际事件的列表。这意味着,如果服务器非常繁忙,epoll没有任何优势。但是,如果您在很长一段时间内维护大量描述符……并且大多数描述符大部分时间处于空闲状态,那么如果您有只涉及少数连接的非常快速的事件,epoll将具有优势。也就是说,O(无论什么)是关于用户实现的可能性,而不是轮询/epoll的实际行为。最重要的一点是:关于监视描述符(FD)数量的轮询复杂性是O(n),因为它在每次“就绪”事件发生时扫描所有FD,epoll基本上是O(1)因为它不会对所有关注的描述符进行线性扫描。。因此,
    epoll
    poll()缩放得更好。
    根据我的测试,poll不是O(N)。如果任何描述符与事件匹配,它将立即返回。最坏的情况是O(N)。使用epoll时,您设置了等待的最大事件数,因此在最坏的情况下,m