0

0

c++的协程在网络编程中有哪些性能优势? (对比Boost.Asio)

冰火之心

冰火之心

发布时间:2026-01-13 13:00:44

|

363人浏览过

|

来源于php中文网

原创

协程不直接提升性能,而是通过降低异步编程复杂度、减少调度开销、改善内存局部性、简化错误与取消处理,间接支撑更高吞吐和更低延迟。

c++的协程在网络编程中有哪些性能优势? (对比boost.asio)

协程让异步代码写得像同步,但不是性能提升的直接原因

很多人误以为 C++20 协程本身比 Boost.Asio 快——其实不然。co_await 不加速网络 I/O,它不减少系统调用次数,也不绕过 epoll/kqueue。真正的优势在于:**降低异步逻辑的编写成本和维护成本,从而间接支撑更高吞吐、更低延迟的服务架构**。Boost.Asio 的 async_read/async_write 需要拆解控制流、管理状态机、处理异常传播困难;而协程能把多轮 handshake、TLS 握手、协议解析等串行等待逻辑,自然地写在同一个函数里,避免分裂和回调地狱。

调度开销更小:协程挂起/恢复 ≈ 函数调用级别,远低于 Asio 的 handler 分发

Boost.Asio 每次完成一个异步操作(比如一次 async_read),都要把 handler 封装成 std::function 对象,通过 io_context::post() 或内部队列分发,涉及堆分配(除非启用了 handler memory optimization)、虚函数调用、锁竞争(多线程 io_context 下)。而协程的 co_await 挂起只是保存栈帧指针和寄存器上下文,恢复时直接跳转,无动态分配、无锁、无类型擦除。

  • 协程 awaiter 的 await_suspend() 可直接把当前协程 handle 交给自定义调度器(如单线程 event loop),跳过 Asio 的 handler 注册链路
  • Asio 的 spawn()(基于 Boost.Coroutine2)也提供类似能力,但它不是标准、依赖额外 ABI、且栈切换开销仍高于 C++20 无栈协程
  • 实测在高并发短连接场景(如 HTTP/1.1 keep-alive pipeline),协程版 echo server 比等效 Asio 回调版本减少约 12–18% 的 CPU time(主要省在 handler 构造/析构和调度路径)

内存局部性更好:协程栈可复用,避免 Asio handler 的分散堆分配

Asio 中每个异步操作通常对应一个独立的 handler 对象,生命周期由 io_context 管理,常驻堆上。大量并发连接下,这些 handler 在内存中随机分布,cache miss 显著。C++20 协程默认使用“无栈”模型,但可通过自定义 promise_type 把协程帧(frame)分配在预分配的内存池中(例如 per-connection arena),配合 connection 对象一起构造/销毁,大幅提升访问局部性。

struct my_promise {
    static void* operator new(size_t sz) { return g_per_conn_pool.allocate(sz); }
    static void operator delete(void* p, size_t sz) { g_per_conn_pool.deallocate(p, sz); }
    // ...
};

这种控制粒度是 Asio 原生无法提供的——它的 handler 分配策略由 asio::associated_allocator 决定,但难以与 connection 生命周期对齐。

立即学习C++免费学习笔记(深入)”;

Rationale
Rationale

Rationale 是一款可帮助企业主、经理和个人做出艰难的决定的AI工具

下载

错误传播与取消更自然,减少防御性拷贝和状态冗余

Asio 中取消一个正在进行的操作,需调用 socket.cancel(),然后等待所有 pending handler 被唤醒并检查 ec == asio::error::operation_aborted;同时,异常不能跨 async_* 边界传播,必须手动封装进 error_code。协程则允许:

  • co_await socket.async_read_some(...) 直接抛出异常(如 TLS 解密失败),由外层 try/catch 捕获
  • 通过 co_await std::stop_token 或自定义取消点(co_await when_stopped(token))实现协作式取消,无需侵入 I/O 调用本身
  • 避免为每个 handler 拷贝 connection state、buffer、parser context —— 它们天然在协程栈上,生命周期一致

这不仅减少 bug,也让压测时的 cancel-heavy 场景(如客户端断连、超时熔断)响应更快、资源释放更确定。

协程不是银弹:它要求你重写整个异步执行模型,兼容现有 Asio 生态(如 ssl_stream、serial_port)需要适配器;调试 stack trace 仍不如同步代码直观;编译器对协程的优化仍在演进。真正关键的是——别为了协程而协程,先确保你的瓶颈真在控制流复杂度,而不是网卡或 syscall 本身。

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

187

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

271

2023.10.25

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6081

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

799

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1056

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1212

2024.03.01

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6081

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

799

2023.09.14

PHP 表单处理与文件上传安全实战
PHP 表单处理与文件上传安全实战

本专题聚焦 PHP 在表单处理与文件上传场景中的实战与安全问题,系统讲解表单数据获取与校验、XSS 与 CSRF 防护、文件类型与大小限制、上传目录安全配置、恶意文件识别以及常见安全漏洞的防范策略。通过贴近真实业务的案例,帮助学习者掌握 安全、规范地处理用户输入与文件上传的完整开发流程。

5

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 787人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号