COROUTINE协程库:网络性能完爆ASIO异步模型(-O3测试)

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

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

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

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

  PS:之前做过一次对比测试,有人指出测试中并未开启O3优化,对Asio极为不公平

    那个公布测试结果的blog已经删除,特此开启O3优化重新测试一遍,以正视听。

简要介绍一下测试流程:

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

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

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

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

    A)用Coroutine编写

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

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

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

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

测试结果图:

      

  

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

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

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

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

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

社区交流群:296561497

时间: 2024-10-01 22:43:40

COROUTINE协程库:网络性能完爆ASIO异步模型(-O3测试)的相关文章

Coroutine协程库:网络性能完爆Asio异步模型

在purecpp社区的github组织中有一个协程库:https://github.com/topcpporg/cpp_features 近日有用户找到我,想要了解一下coroutine库在网络方面的性能,于是选取已入选标准库的boost.asio网络库的异步模型做了一次对比测试,结果完爆asio异步模型,coroutine库网络性能是asio异步模型的2-14倍,使用8线程处理小包时,QPS可达670万/秒. 简要介绍一下测试流程: 1.TCP协议,C/S是同一台物理机的两个进程,建立1000

CPU的最小执行单位是线程,协程不需要qt支持...直接用现成的协程库就行了

协程也就在I/O操作上才有优势,Qt事件循环,本事很多I/O已经是异步了,利用好异步(虽然都说异步有点反人类思维).因为CPU的执行最小单位是线程,协程也只是在其之上又调度而已. 我的意思是利用好异步的优势.协程是程序级别的调度,对于CPU执行来说,没任何优势的. CPU的最小执行单位是线程,单线程里十万个协程,也就一个在工作,利用不了并行优势.对于高运算的程序,协程除了增加调度开销并没有优势的.对于I/O操作较多的程序才有用,因为I/O太慢.而对应I/O操作,异步相对与协程开销更小,效率也更高

Stackful 协程库 libgo(单机100万协程)

libgo 是一个使用 C++ 编写的协作式调度的stackful协程库, 同时也是一个强大的并行编程库. 设计之初是为高并发分布式Linux服务端程序开发提供底层框架支持,可以让链接进程序的同步的第三方库变为异步库,不影响逻辑的前提下提升其性能. 目前支持两个平台: Linux (GCC 4.8+) Windows (Win7.Win8.Win10 x86 and x64 使用VS2013/2015编译) 使用libgo编写并行程序,即可以像golang一样开发迅速且逻辑简洁,又有C++原生的

基于ASIO的协程库orchid简介

什么是orchid? orchid是一个构建于boost库基础上的C++库,类似于python下的gevent/eventlet,为用户提供基于协程的并发模型. 什么是协程: 协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态.协程在控制离开时暂停执行,当控制再次进入时只能从离开的位置继续执行. 协程已经被证明是一种非常有用的程序组件,不仅被python.lua.ruby等脚本语言广泛采用,而且被新一代面向多核的编程语言如golang

基于ASIO的协程与网络编程

协程 协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态.协程可以在运行期间的某个点上暂停执行,并在恢复运行时从暂停的点上继续执行. 协程已经被证明是一种非常有用的程序组件,不仅被python.lua.ruby等脚本语言广泛采用,而且被新一代面向多核的编程语言如golang rust-lang等采用作为并发的基本单位. 协程可以被认为是一种用户空间线程,与传统的线程相比,有2个主要的优点: 与线程不同,协程是自己主动让出CPU,并交付

C高级 跨平台协程库

1.0 协程库引言 协程对于上层语言还是比较常见的. 例如C# 中 yield retrun, lua 中 coroutine.yield 等来构建同步并发的程序. 本文就是探讨如何从底层实现开发级别的协程库. 在说协程之前, 简单温故一下进程和纤程关系. 进程拥有一个完整的虚拟地址空间,不依赖于线程而独立存在. 线程是进程的一部分,没有自己的地址空间, 与进程内的其他线程一起共享分配给该进程的所有资源.进程和纤程是1对多关系, 协程同线程关系也是类似. 一个线程中可以有多个协程. 协程同线程相

ucontext-人人都可以实现的简单协程库

1.干货写在前面 协程是一种用户态的轻量级线程.本篇主要研究协程的C/C++的实现. 首先我们可以看看有哪些语言已经具备协程语义: 比较重量级的有C#.erlang.golang* 轻量级有python.lua.javascript.ruby 还有函数式的scala.scheme等. c/c++不直接支持协程语义,但有不少开源的协程库,如: Protothreads:一个"蝇量级" C 语言协程库 libco:来自腾讯的开源协程库libco介绍,官网 coroutine:云风的一个C语

轻量级协程库C语言实现

仿制云风的协程库的接口设计,我花了一个下午加晚上的时间重构了之前写的协程库,提供的接口现在和云风大大的协程接口一模一样,都是仿制lua的非对称协程.我们依旧没有用ucontext.h组件(用ucontext.h组件实现协程的文章铺天盖地,可以自行寻找,用longjmp实现就少很多,用内联汇编实现的就更少了),我们的协程库可以运行在兼容X86平台的操作系统上,各种unix-like操作系统,windows操作系统都可以,不过得用gcc或者clang或者与之兼容的mingw编译工具编译出32位的程序

协程库st(state threads library)原理解析

协程库state threads library(以下简称st)是一个基于setjmp/longjmp实现的C语言版用户线程库或协程库(user level thread).基本介绍在这 http://state-threads.sourceforge.net/docs/st.html.这里有一个基本的协程例子 http://www.csl.mtu.edu/cs4411.ck/www/NOTES/non-local-goto/coroutine.html, 可以了解setjmp和longjmp的