这两个lib都是为异步i/o调度而设计的,都是在linux上使用epoll,在FreeBSD上使用kqueue等.
除了肤浅的差异,我的意思是这两个库之间的真正区别是什么?关于建筑或设计哲学?
Rei*_*ica 215
至于设计理念,libev的创建是为了改进libevent中的一些体系结构决策,例如,全局变量使用使得很难在多线程环境中安全地使用libevent,观察器结构很大,因为它们结合了I/O,时间和信号处理程序在一个,http和dns服务器等额外组件遭受了糟糕的实现质量和导致的安全问题,并且计时器不精确,并且不能很好地应对时间跳跃.
Libev尝试改进其中的每一个,不使用全局变量,而是对所有函数使用循环上下文,通过对每个事件类型使用小观察者(I/O观察者在x86_64上使用56个字节,而在libevent中使用136个字节),允许额外的事件类型,例如基于wallclock的计时器与单调时间,线程间中断,准备和检查观察者以嵌入其他事件循环或嵌入等等.
额外的组件问题是通过不使用它来"解决",因此libev可以小而有效,但是你还需要在其他地方寻找一个http库,因为libev根本没有一个(例如,有一个非常相关的库名为libeio,它执行异步I/O,可以单独使用或与libev一起使用,因此您可以混合使用).
简而言之,libev只尝试做一件事(POSIX事件库),并以最有效的方式做到这一点.Libevent试图为您提供完整的解决方案(事件库,非阻塞I/O库,http服务器,DNS客户端).
或者,甚至更短,libev尝试遵循UNIX工具箱的理念,即尽可能地做一件事.
请注意,这是设计理念,我可以用权威说明,因为我设计了libev.是否实际达到了这些设计目标,或者哲学是否基于合理的原则,由您来判断.
2017年更新:
我多次被问到我所引用的计时器不精确性,以及为什么libev不支持Windows上的IOCP.
对于计时器,libevent计划相对于未来某个未知基准时间的计时器,而不知道它.Libev可以事先告诉你它将用于安排计时器的基准时间,这允许程序同时使用libevent方法和libev方法.此外,libevent有时会提前到期,具体取决于后端.前者是API问题,后者是可修复的(并且可能已经修复,因为 - 我没有检查).
至于IOCP支持 - 我不认为可以做到,因为IOCP根本不够强大.首先,它们需要一种特殊的套接字类型,这将限制Windows上允许的句柄集合(例如,perl使用的sopckets对于IOCP来说是"错误的"类型).此外,IOCP根本不支持I/O就绪事件,它们只能进行实际的I/O. 某些句柄类型有变通方法,例如执行虚拟0字节读取,但同样,这将限制您可以在Windows上使用的句柄类型甚至更多,并且还将依赖于可能未被所有套接字提供程序共享的未记录的行为.
据我所知,没有其他事件库也支持Windows上的IOCP.libevent的作用是,除了事件库之外,它还允许您对读/写操作进行排队,然后可以通过IOCP进行操作.由于libev不为您执行I/O,因此无法在libev本身中使用IOCP.
这确实是设计 - libev试图小而类似于POSIX,而windows根本没有一种有效的方式来获得POSIX风格的I/O事件.如果IOCP很重要,您必须自己使用它们,或者确实使用一些为您执行I/O的其他框架,因此可以使用IOCP.
Vit*_*aev 13
libevent对我来说的巨大优势是内置的OpenSSL支持.Bufferevent接口,在2.0版本的libevent API中引入,为开发人员几乎无痛地处理安全连接.可能是我的知识已经过时但似乎libev不支持这一点.