转:http://www.cnblogs.com/Lifehacker/p/whats_the_difference_between_libevent_and_libev_chinese.html

[译]libev和libevent的设计差异

本文译自what's the difference between libev and libevent? 作者是libev作者

[问]两个库都是为异步io调度而设计,在Linux上都是使用epoll机制,在FreeBSD上则都是kqueue,还有诸如此类的很多相通之处。

除了这些表面上的差别外,其实这两者根本的区别在哪里呢?比如架构上,或者设计哲学上。

[答]就设计哲学来说,libev的诞生,是为了修复libevent设计上的一些错误决策。例如,全局变量的使用,让libevent很难在多线程环境中使用。watcher结构体很大,因为它们包含了I/O,定时器和信号处理器。额外的组件如HTTP和DNS服务器,因为拙劣的实现品质和安全问题而备受折磨。定时器不精确,而且无法很好地处理时间跳变。

libev试图改进所有这些缺陷,例如避免使用全局变量,转而在所有函数中,使用上下文变量来代替。每个事件类型,使用单独的watcher类型(一个I/O watcher在64位机器上,只需要56字节。而libevent需要136字节)。允许额外的事件类型,例如基于挂钟的计时器,或者单调时间,线程内中断,准备并检查watchers来嵌入其他事件循环,或者被用于其他事件循环来嵌入。

额外组件的问题,是通过直接去掉额外组件来解决的,这样libev就可以小而美,快速高效了。但你也需要从其他地方寻找http库。因为libev没有带上。(例如,有一个库叫libeio,可以完成异步IO的工作,也可以和libev配合使用)。

总而言之,libev试图做好一件事而已(目标是成为POSIX的事件库),这是最高效的方法。libevent则尝试给你全套解决方案(事件库,非阻塞IO库,http库,DNS客户端)

一句话总结,libev尝试追随UNIX工具箱哲学,一次只干一件事,每次都做到最好。

注意,这是libev的设计哲学,我想我作为libev的设计者,有着足够的发言权。至于这些设计目标有没有实际达到,或者这些设计哲学是否坚实可靠,则交由你来评判。

[译者注]第一次注意到libev,是在gevent的开发者blog上的这篇libev and libevent,它简要说明了gevent从libevent切换到libev的决策过程。回顾gevent,它实际需要的只是一个负责事件循环的C库,在上面的HTTP库和DNS库,都可以交由标准库强大得不得了的python完成。因此,作者的选择还是非常明智的。

从Libevent 2.0来看,libevent团队已经意识到上述的问题,也提取出了event loop这个上下文context,但是在具体的DNS解析,HTTPS连接等等,还是有种力不从心的感觉。作为libevent的使用者,我们经历了libevent的试错阶段,发现HTTPS实现不行,再切换到libcurl去,与其这样,倒不如直接不提供该功能呢

转:libev和libevent的设计差异的更多相关文章

  1. [译]libev和libevent的设计差异

    本文译自what's the difference between libev and libevent? 作者是libev作者 [问]两个库都是为异步io调度而设计,在Linux上都是使用epoll ...

  2. Libev和LibEvent

    libev和libevent功能基本相同,名称相近,到底该用哪一个呢?zhouhh@zhh64:~$ sudo apt-cache search libeventlibevent-dev – Deve ...

  3. [转帖]聊聊Web App、Hybrid App与Native App的设计差异

    聊聊Web App.Hybrid App与Native App的设计差异 https://www.cnblogs.com/zhuiluoyu/p/6056672.html 编者按:这3类主流应用你都了 ...

  4. libev与libevent区别

    摘自stackflow的回答,主要从架构上说明了二者的区别: As for design philosophy, libev was created to improve on some of the ...

  5. HDFS 与 GFS 的设计差异

    后端分布式系列」前面关于 HDFS 的一些文章介绍了它的整体架构和一些关键部件的设计实现要点. 我们知道 HDFS 最早是根据 GFS(Google File System)的论文概念模型来设计实现的 ...

  6. 聊聊Web App、Hybrid App与Native App的设计差异

    目前主流应用程序大体分为三类:Web App.Hybrid App. Native App. 一.Web App.Hybrid App.Native App 纵向对比 首先,我们来看看什么是 Web ...

  7. 超赞!聊聊WEB APP、HYBRID APP与NATIVE APP的设计差异

    编者按:这3类主流应用你都了解吗?设计师除了要有视觉功夫,对不同形式的APP也应当了然于胸,今天百度的同学写了一篇非常全面的总结,帮你迅速搞定3类主流APP的设计方法,附带一大波避雷针,带你巧妙跳过A ...

  8. 后端分布式系列:分布式存储-HDFS 与 GFS 的设计差异

    「后端分布式系列」前面关于 HDFS 的一些文章介绍了它的整体架构和一些关键部件的设计实现要点. 我们知道 HDFS 最早是根据 GFS(Google File System)的论文概念模型来设计实现 ...

  9. Web App、Hybrid App与Native App的设计差异

    目前主流应用程序大体分为三类:Web App.Hybrid App. Native App. 一.Web App.Hybrid App.Native App 纵向对比 首先,我们来看看什么是 Web ...

随机推荐

  1. TB平台搭建之二

    主要想记录关于debug问题: 一般我会1.定位问题所在位置比如使能信号错误.地址读写错误.数据流pipeline错误.... 2.首先看问题的源头(对应信号)是否还正确,比如出现XX要查看她的第一级 ...

  2. python--MySQL权限管理 数据备份还原

    一 权限管理 mysql最高管理者是root用户, 这个一般掌握在公司DBA手里, 当你想去对数据库进行一些操作的时候,需要DBA授权给你. 1. 对新用户增删改 1. 创建用户 # 要先use my ...

  3. 面试Python工程师,这几道编码题有必要背背,Python面试题No8

    第1题:列表[1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用列表推导式提取出大于10的数,最终输出[16,25]. map是python高阶用法,字面意义是映射,它的 ...

  4. R语言基础-data.frame

    data.frame比较像表格,每一列是一个向量,即每列中的元素是同一类型:所有列具有相同的长度. x = 10:1 y = -4:5 q = c("Ha","oh&qu ...

  5. linux c中需要记住的东西

    1.记住常见的字符的ASCII值 a------------97     b------------98     A------------65     B------------66     空格' ...

  6. static对局部变量的作用

    static修饰局部变量: 1,延长局部变量的生命周期到程序技术时,局部变量才会被销毁 2,并没有改变局部变量的作用域 static修饰局部变量的使用场合: 1,如果某个函数的调用频率特别高 2,这个 ...

  7. hdu2083

    开始忘排序了. #include <stdio.h> #include <math.h> #include <algorithm> using namespace ...

  8. 九度oj 题目1025:最大报销额

    题目描述:     现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600 ...

  9. 自定义Title

    xml: <jp.co.view.TitleLayout android:id="@+id/titleLayout" android:layout_width="m ...

  10. BZOJ3532 [Sdoi2014]Lis 【网络流退流】

    题目 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若 干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出将删去项的附加属性排序 ...