高性能网络库 Picoev

码农软件 · 软件分类 · 高性能网络开发库 · 2019-08-31 19:28:08

软件介绍

Picoev 是一个 C 开发的高性能网络库。Picoev在项目下有把Picoev和libevent这些库做对比,作者也提了一下为什么picoev的速度会这么快。

   


主要有两个原因:

  1. picoev几乎所有顺序结构都是用数组实现的,索引访问速度比libevent的链表快很多。 

  2. picoev采用了环形队列+vector+bitmap来实现定时事件的检测。

picoev的picoev_loop_once:

int picoev_loop_once(picoev_loop* loop, int max_wait) {
    loop->now = time(NULL);  //获取当前时间
    // 最大等待事件不超过计时器的处理时间
    if (max_wait > loop->timeout.resolution) {
      max_wait = loop->timeout.resolution;
    }
    // 使用select去检测事件是否完成,如果完成就调对应的回调函数处理
    if (picoev_poll_once_internal(loop, max_wait) != 0) {
      return -1;
    }
    if (max_wait != 0) {  //有指定时间则刷新当前时间
      loop->now = time(NULL);
    }
    // 处理到时间的计时事件
    picoev_handle_timeout_internal(loop);
    return 0;
}

这里主要讲一下loop的结构,因为这是高效的原因。

  1. 对于timeout环形队列,每经过resolution时间就往后移动一块,当前队头永远指向刚刚到达时间的事件块,如图当前处理的是2,那么说明队列头在2,那么再经过resolution时间就会到3,根据时间不断后移,循环利用。

  2. 在处理每一块timeout里面注册的事件时,遍历所有不为0的vector,得出对应的fd。图中已经写的很清楚的,其实原理和16进制一样简单。插入一个事件的效率为O(1),遍历所有在timeout块的注册事件效率为O(n)[注:这里n为timeout里面注册事件的个数],对比lievent的最小堆O(logn)插入,每次处理一个后调整堆的复杂度O(logn)处理n个就为O(nlogn),确实是高效很多。

  3. 还有一个高效的地方在于,picoev是检测到有一个事件就马上处理(无阻塞),不像libevent挂起等待最小等待时间到达(阻塞),然后才对所有就绪事件队列里面的事件进行处理,不过这也导致了picoev不能设定事件处理的优先级。

缺点(对比libevent):作者在最后说picoev并没有libevent成熟,也没有很多功能,现在只支持select,epoll,kqueue,我们也可以看到没有信号事件的处理,优先级设定这些功能的支持。不过他简单快速,而且支持多线程。

本文地址:https://www.codercto.com/soft/d/13594.html

CSS权威指南(第三版·英文影印版)

CSS权威指南(第三版·英文影印版)

[美] Eric A.Meyer / 东南大学出版社 / 2007-06 / 68.00元

著名的CSS专家Eric A.Meyer他招牌式的智慧和无与伦比的经验引领读者探索了CSS的各个部 分,包括属性、标记、特性和实现。此外,他还就现实应用中的一些问题,例如浏览器的支持和设计方针,发表了看法。你所要知道的就是HTML 4.0的知识,这样就可以创建整洁、易于维护的脚本,以与桌面出版系统同样的优雅和控制能力管理网站布局和分页。你将会学到: 精妙地设计文本风格 用户界面、......一起来看看 《CSS权威指南(第三版·英文影印版)》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具