现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

libevent、libev、libuv、IOCP、asio、muduo优劣分析

2019-01-22 22:47 工业·编程 ⁄ 共 1293字 ⁄ 字号 暂无评论

今天分享一个网络库选择的文章,当时我负责公司服务器的改造工作,需要选择一个适合的开源网络库。

欲使用开源网络库libevent、libev、libuv、IOCP、asio、muduo中的一个,经过对比分析,因本服务器系统目前于windows下运行,考虑到未来跨平台的支持,最终选定libevent开源网络库。

技术对比:

1.libevent

C语言跨平台,应用最广泛,历史悠久的跨平台事件库。这是一个用纯C写的开源库,属于一个轻量级的网络中间件。其中用到的基本数据结构也是非常巧妙。展现反应堆模型的基本使用方法。不同的事件对应不容的处理方法。I/O 定时 信号。三种事件的处理单独分开,又通过事件驱动融合在一起。

优先级特性:激活的事件组织在优先级队列中,各类事件默认的优先级是相同的,可以通过设置事件的优先级使其优先被处理。

libevent在windows下支持iocp,但还不完善。

2.libev

设计更简练,性能更好,但因对Windows支持不够好,排除。

优先级特性:激活的事件组织在优先级队列中,各类事件默认的优先级是相同的,可以通过设置事件的优先级使其优先被处理。

3.libuv

libuv是一个支持多平台的异步IO库。它主要是为了node.js而开发的。

优先级特性:没有优先级概念,按照固定的顺序访问各类事件。

因libuv为node.js定向开发,普遍应用性不好,且事件触发不可设定优先级,排除。

4.IOCP

IOCP是windows下IO事件处理的最高效的一种方式,结合OVERLAPPED IO可以实现真正的完全异步IO。不支持跨平台。

考虑到未来跨平台的可能,排除。

5.boost::asio

C++语言跨平台。用bind做回调也并不比虚函数好,看上去灵活了,代价却更高了。不光是运行时的内存和时间代价,编译时间也更长。基于ASIO开发应用,要求程序员熟悉函数对象,函数指针,熟悉boost库中的boost::bind,内存管理控制方面。

asio是一个高性能的网络开发库,Windows下使用IOCP,Linux下使用epoll。

考虑到asio的使用,对现有系统的改造难度大,排除。

6.Muduo

这是一个用纯c++写的库,仅在linux下使用,one loop per thread的思想贯穿其中,将I/O 定时 信号都通过文件描述符的方式融合在一起,三类事件等同于一类事件来看待。

因仅在linux下使用,故而排除。

最终选择了lievent网络库作为高并发服务器改造使用库,原服务器在QT上开发的,另附上QT下编译libevent的方法:

QT下编译libevent静态库

libevent官网下载最新版本的源码包。http://libevent.org/

解压源码包后,使用mingw编译器编译libevent。

# tar zxvf libevent-1.2.tar.gz

# cd libevent-1.2

# ./configure

# make

# make install

将生成的libevent.a、libevent_core.a、libevent_extras.a静态库文件复制到qt的项目文件夹下,添加到qt项目中。

 

给我留言

留言无头像?