我最近在读Redis。
Redis基于I/O复用实现了一个简单的事件驱动库。
Redis表示将选择系统支持的最佳多路复用,并提供以下代码:
/* Include the best multiplexing layer supported by this system.
* The following should be ordered by performances, descending. */
#ifdef HAVE_EVPORT
#include "ae_evport.c"
#else
#ifdef HAVE_EPOLL
#include "ae_epoll.c"
#else
#ifdef HAVE_KQUEUE
#include "ae_kqueue.c"
#else
#include "ae_select.c"
#endif
#endif
#endif
我想知道它们是否存在根本的性能差异?如果是这样,为什么?
此致
最佳答案
通常,所有异步I/O子系统都有不同的内部结构,但是在当前特定情况下,这些具体的异步I/O库用于支持尽可能多的平台。那是:
fallback
形式安装在所有平台上Evport
,Epoll
和KQueue
具有 O(1)描述符选择算法复杂度,并且它们都使用内部内核空间内存结构。他们还可以提供很多(成千上万个)文件描述符。除其他以外,
select
最多只能为提供最多1024个描述符,并且对描述符进行完全扫描(因此每次迭代所有描述符以选择一个可使用的描述符),因此复杂度为 O(n)。关于unix - select,epoll,kqueue和evport之间的根本区别是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26420947/