博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

libgo 魅族

Posted on 2016-10-09 09:57  bw_0927  阅读(415)  评论(0)    收藏  举报

http://www.oschina.net/p/libgo

 

 

libgo 是一个使用 C++ 编写的协作式调度的stackful协程库, 同时也是一个强大的并行编程库。

设计之初是为高并发分布式Linux服务端程序开发提供底层框架支持,可以让链接进程序的同步的第三方库变为异步库,不影响逻辑的前提下提升其性能

目前支持两个平台:

  • Linux (GCC 4.8+)

  • Windows (Win7、Win8、Win10 x86 and x64 使用VS2013/2015编译)

使用libgo编写并行程序,即可以像golang一样开发迅速且逻辑简洁,又有C++原生的性能优势。

  • 1.提供golang一般功能强大协程,基于corontine编写代码,可以以同步的方式编写简单的代码,同时获得异步的性能

  • 2.支持海量协程, 创建100万个协程只需使用2GB内存

  • 3.允许用户自由控制协程调度点,随时随地变更调度线程数;

  • 4.支持多线程调度协程,极易编写并行代码,高效的并行调度算法,可以有效利用多个CPU核心

  • 5.可以让链接进程序的同步的第三方库变为异步调用,大大提升其性能。再也不用担心某些DB官方不提供异步driver了,比如hiredis、mysqlclient这种客户端驱动可以直接使用,并且可以得到不输于异步driver的性能。

  • 6.动态链接和静态链接全都支持,便于使用C++11的用户静态链接生成可执行文件并部署至低版本的linux系统上。

  • 7.提供协程锁(co_mutex), 定时器, channel等特性, 帮助用户更加容易地编写程序.

  • 8.网络性能强劲,在Linux系统上超越ASIO异步模型;尤其在处理小包和多线程并行方面非常强大

  • 在源码的samples目录下有很多示例代码,内含详细的使用说明,让用户可以很轻易地学会使用libgo。

 

#include <stdio.h>

#include <libgo/coroutine.h>
 
co_main(int argc, char **argv)
{
    go []{
        printf("1\n");
        co_yield;
        printf("2\n");
    };
 
    go []{
        printf("3\n");
        co_yield;
        printf("4\n");
    };
 
    return 0;
}
 
 
===================
http://www.cnblogs.com/yyzybb/p/4726721.html
 

在purecpp社区的github组织中有一个协程库:https://github.com/yyzybb537/libgo

  近日有用户找到我,想要了解一下libgo库在网络方面的性能,于是选取已入选标准库的boost.asio网络库的异步模型做横向对比。

  在小包和利用多核方面,libgo库的网络性能完爆asio异步模型,8线程处理小包时差距可达十几倍。

      在大包+单线程的情况,libgo库的网络比asio异步模型高的不是很多,在一些性能比较差的PC机上,甚至出现性能。

简要介绍一下测试流程:

  1.TCP协议,C/S是同一台物理机的两个进程,建立1000条连接

  2.服务的是echo服务器,收到数据原样发回,客户端无限次发送指定大小的数据包,测试取样包大小为:4字节、32字节、128字节、1024字节、4096字节

  3.分不同线程数测试,测试取样线程数为:单线程,2线程,4线程,8线程

  4.用于对比测试的服务端程序分别为:

    A)用libgo+syscall编写

    B) 用boost.asio异步模型编写

  5.使用同样的客户端程序,以减少干扰

  5.测试环境是一台拥有2颗6核12线程CPU的物理机服务器,共24个逻辑线程,Linux系统版本为:CentOS 6.2。

       (核心较少的PC机无法发挥libgo的优势,测试结果差距会缩小)

 

测试结果图:

      

  

 

本次测试,并不能说明Asio的性能就一定比libgo库的网络性能更差,Asio是对系统调用的一层封装,很nice的设计,留给用户很大的优化余地;

花大力气去调优Asio,也是有希望达到甚至超越libgo库的网络性能的。

在实际使用libgo库时,我更加推荐的是libgo+Asio同步模型的使用方式,性能与开发效率二者可以兼得,而不是从系统调用写起,已开源libgonet网络库!

 

本次测试所用服务端为git库中的benchmark/co_server.cpp和benchmark/asio/async_asio_server.cpp  客户端代码为: benchmark/co_client.cpp

libgo+Asio同步的使用示例在benchmark/asio_sync目录下

 

 

https://github.com/topcpporg/cpp_features/tree/master/coroutine/benchmark

https://github.com/topcpporg/cpp_features/find/master

https://github.com/yyzybb537?tab=repositories