高性能网络库 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://codercto.com/soft/d/13594.html

Out of their Minds

Out of their Minds

Dennis Shasha、Cathy Lazere / Springer / 1998-07-02 / USD 16.00

This best-selling book is now available in an inexpensive softcover format. Imagine living during the Renaissance and being able to interview that eras greatest scientists about their inspirations, di......一起来看看 《Out of their Minds》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

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

HTML 编码/解码