网易首页 > 网易号 > 正文 申请入驻

你写的async/await,正在悄悄浪费性能

0
分享至

await 一写,方法就被剪成两半最大的问题:一大半“等待”是白等微软试过绿线程,最后砍了Runtime Async:不暂停,就不收钱成绩单:最快快了近 20 倍写在最后:抽象的账单

中午点了份外卖,你会站在门口干等一小时吗?不会。你会继续敲代码、继续开会,手机一响再下去拿——等的事让它等着,手里的活别停。

程序里的 async/await 干的就是这件事:遇到要等的操作(比如读文件、发网络请求),先把 CPU 让出去干别的,等结果回来了再接着跑。这套写法优雅得像常识,用了十几年,几乎所有主流语言都有。

但微软最近干了一件大事:把这个用了十几年的模型从底层整个重做了一遍。原因说出来有点意外——你写下的每一行 await,很多时候都在“白等”,而且为了这场白等,程序一直在偷偷交一笔看不见的税。今天咱们把这笔账算明白。

先看一段最常见的异步代码:



await 的意思是:这里有暂停点。而 C# 编译器一看到暂停点,就会掏出剪刀,把整个方法沿着每个 await 剪开,重新组装成一个{BOLD('状态机')}——用大白话讲,就是把“先 A 再 B 再 C”的一段代码,改造成“执行到一半先存档,被叫醒后读档接着跑”的机器:



方法返回值也被换成了 Task——一个“提货凭证”,调用方拿着它等结果。这套机制好不好用?好用。写代码的人体验非常顺:异步写得像同步一样直白。但代价藏在你看不见的地方。

关键漏洞在于:编译器改写代码时,是{BOLD('一个方法一个方法看的')}。它不知道你 await 的那个方法内部到底会不会真的暂停。比如:



调用它的方法明明不用暂停,但编译器照样给两边都造一套状态机、都发一张 Task 提货凭证。那 JIT 运行时能不能帮忙补救?也很难——因为编译器早就把原始代码拆成了状态机碎片,JIT 看到的已经不是连贯的调用链,而是一堆“存档、读档、传凭证”的机械动作,想优化也无从下手。

而现实世界里,这种白等比想象中普遍得多:

  • • 调用链通常只有最里层真的在等:外面几层 await 只是“传话筒”,把结果原样递上去,自己根本没停过;
  • • 有的调用链从头到尾都不会暂停:异步套异步,最里层却是同步逻辑,整条链实际是同步跑完的;
  • • 大量分布式计算系统:代码长得是异步的,实际负载大部分是同步的。

结果就是:每一层 async 方法都提前交了“状态机 + Task 对象”的钱,哪怕它压根没等过一下。

其实在重做 async 之前,.NET 团队还试过另一条路:{BOLD('绿线程')}(Green Thread)——类似 Go 语言的 goroutine、Java 的虚拟线程,在用户态养一堆超轻量的“小线程”。听起来很美好,实测一堆坑:

  • • 再轻也是个完整线程:寄存器、调用栈、调度元数据一样不能少。goroutine 的栈起步就要约 2KB——这点空间够创建几百个 async 状态机;
  • • 碰系统调用就露馅:绿线程最终还得借真正的系统线程去干系统调用的活,来回切换折腾。官方实测做 1 亿次系统调用,耗时从约 300ms 涨到约 1800ms,直接慢了 5 倍以上;
  • • 跟线程绑定的代码合不来:图形界面、各种依赖“必须在某个固定线程上跑”的 API,都会让调度开销暴涨,甚至比直接用系统线程还慢;
  • • 最扎心的一锤:扔进 ASP.NET Core 实测,每秒请求数(RPS)不升反降。

又重又慢还不讨好,这个实验最终被官方放弃,团队转头去搞了真正的答案:Runtime Async。

新思路反而简单粗暴:{BOLD('编译器什么都别拆了')},把 async 方法原始的异步控制流原封不动交给 JIT。以前 JIT 看到的是编译器嚼碎的状态机残渣,现在它直接看到完整逻辑,想优化、想内联,随它。

为此运行时引入了一套全新的调用约定:每次调用异步方法,多塞一个“存档对象”(Continuation),并把结果和存档一起传回来:



规则很好懂:第一次调用时存档是空的,方法就像普通函数一样一口气往下跑——{BOLD('只要中途没真的暂停,直接把结果带回来,存档还是空的,Task 对象从头到尾都不会被创建')}。只有真的在某处暂停了,运行时才补一个轻量存档(只需几十个字节,记下局部变量和恢复点),暂停结束后带着存档回来接着跑。

看一个递归算斐波那契的异步方法被新编译器处理后的样子:



注意看:除了原始逻辑,{BOLD('一个状态机都没有')}。状态机、提货凭证、存档……全部消失,直到真正需要暂停的那一刻才出现。这就是官方说的 pay for play:不为用不上的抽象付费。

官方用每天构建的 .NET 11 实测(对比 .NET 10 的传统 async,每组跑一亿次),挑几组有代表性的数据:



最惊人的是第一行:没有暂停时,异步代码的耗时和纯同步方法的基线(0.33 纳秒){BOLD('几乎完全一样')}——异步抽象的开销被彻底抹平。内存同样夸张:无暂停场景下传统方案跑一亿次分配了 7.2GB 内存,新方案是{BOLD('0 字节')},GC 压力直接归零。而且调用链嵌得越深,提速越明显。



这事最值得普通人咂摸的一点是:{BOLD('好用和快,经常是一对冤家')}。async/await 让无数程序员告别了手写回调地狱,但这份“顺滑”背后,编译器一直在默默拆你的代码、发你的凭证、收你的税。十几年没人觉得有问题,直到有人较真地算了笔账。

Runtime Async 给出的答案也很漂亮:不是推翻好用的语法,而是{BOLD('让底层聪明到配得上这份顺滑')}——你照样写 await,但没暂停时,一切像没发生过一样轻。这种“按真实使用付费”的设计哲学,值得每个写代码的人记在心里。

留个问题:你在写异步代码时踩过什么坑?是忘了 await 导致结果没等到,还是死锁卡了半天?评论区聊聊,点赞最高的下期展开讲——关注不迷路。

声明:内容由AI生成

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
开拓者118-128输勇士!杨瀚森创新高,此战看到4个事实

开拓者118-128输勇士!杨瀚森创新高,此战看到4个事实

篮球大视野
2026-10-17 13:01:53
“监狱海王” 王东:在监狱服刑期间,7名情人陪睡送钱,其中还有一位民警的妻子,狱警协助,情人受到勒索,这段往事让人唏嘘

“监狱海王” 王东:在监狱服刑期间,7名情人陪睡送钱,其中还有一位民警的妻子,狱警协助,情人受到勒索,这段往事让人唏嘘

唠叨说历史
2026-10-13 17:51:39
真能飞的特斯拉刷屏了!马斯克很实在:"如果安全是你的首要目标,那就别买"

真能飞的特斯拉刷屏了!马斯克很实在:"如果安全是你的首要目标,那就别买"

起点财经
2026-10-16 17:31:53
葡萄牙歌手:C罗有半神综合征!世界杯是十个人带一尊雕像!

葡萄牙歌手:C罗有半神综合征!世界杯是十个人带一尊雕像!

罗吹终结者
2026-10-16 20:27:20
马斯克遭遇“踢馆”:有证的飞行汽车研发公司发布其车飞越特斯拉视频,称已领先11年

马斯克遭遇“踢馆”:有证的飞行汽车研发公司发布其车飞越特斯拉视频,称已领先11年

红星新闻
2026-10-17 16:28:14
随着富勒姆1-0、曼城3-2、利物浦2-1逆转,英超最新积分榜出炉

随着富勒姆1-0、曼城3-2、利物浦2-1逆转,英超最新积分榜出炉

侧身凌空斩
2026-10-18 00:10:26
高市早苗称日方将探讨引进核潜艇,中方:在遵守战后国际秩序、恪守国际义务问题上,日方没有所谓“探讨”的余地

高市早苗称日方将探讨引进核潜艇,中方:在遵守战后国际秩序、恪守国际义务问题上,日方没有所谓“探讨”的余地

政知新媒体
2026-10-16 15:47:39
涉案 2.7 万亿缅北电诈主犯佘智江引渡回国,揭开和黄有龙、赵薇的亲属纠葛

涉案 2.7 万亿缅北电诈主犯佘智江引渡回国,揭开和黄有龙、赵薇的亲属纠葛

娱小余
2026-10-16 19:54:37
曾向全国人大建议废除寻衅滋事罪的于凯律师,又就“大病免费医疗”提交建议书

曾向全国人大建议废除寻衅滋事罪的于凯律师,又就“大病免费医疗”提交建议书

老镡讲故事
2026-10-18 08:08:36
3-1!6万多球迷现场见证,中超第2豪取3连胜,成都蓉城无缘提前夺冠

3-1!6万多球迷现场见证,中超第2豪取3连胜,成都蓉城无缘提前夺冠

足球狗说
2026-10-17 20:56:01
妻子满足完男闺蜜,猛然想起是纪念日赶回家却见到门口站着律师

妻子满足完男闺蜜,猛然想起是纪念日赶回家却见到门口站着律师

风起见你
2026-10-18 01:18:52
浙江队球迷意难平!不止因为0-5山东泰山,更多在于以下五点!

浙江队球迷意难平!不止因为0-5山东泰山,更多在于以下五点!

球场新视角1号
2026-10-17 21:54:44
周鹏出征仪式全程没理杜锋,降薪百万回来,不是来演和气的

周鹏出征仪式全程没理杜锋,降薪百万回来,不是来演和气的

衔春信
2026-10-17 05:59:07
黄子韬塌房,早有迹可循

黄子韬塌房,早有迹可循

悠悠说世界
2026-10-17 04:28:10
最新消息:景甜露面被拍,评论区:强撑着体面!

最新消息:景甜露面被拍,评论区:强撑着体面!

默默有话说
2026-10-17 12:31:21
张继科再次反击刘丁硕,字字扎心不留情:认识他没想到这么坏 要撕能撕碎他

张继科再次反击刘丁硕,字字扎心不留情:认识他没想到这么坏 要撕能撕碎他

球盲百小易
2026-10-18 01:28:53
玥儿和筱梅逛街同框!背影神似年轻大S,一家人团聚画面太暖心

玥儿和筱梅逛街同框!背影神似年轻大S,一家人团聚画面太暖心

悠悠说世界
2026-10-18 04:50:44
Model Y,已经“无法无天”了……

Model Y,已经“无法无天”了……

小李车评李建红
2026-10-15 09:54:15
一个中产家庭的自述:我把全家底丢给豆包工作做体检,发现抗风险能力几乎为零

一个中产家庭的自述:我把全家底丢给豆包工作做体检,发现抗风险能力几乎为零

锐眼财经
2026-10-14 12:29:57
“还不分床,等着看德国骨科?”家长晒姐弟俩午睡一幕,让过来人直言:你会后悔的

“还不分床,等着看德国骨科?”家长晒姐弟俩午睡一幕,让过来人直言:你会后悔的

妍妍教育日记
2026-09-14 21:18:41
2026-10-18 08:39:00
千纸鹤安安
千纸鹤安安
大自然的搬运工
170文章数 3关注度
往期回顾 全部

科技要闻

刘煜辉:99%的黄金分析师报告一钱不值

头条要闻

牛弹琴:法国又"燃烧"了 整个国家地图上到处都在冒烟

头条要闻

牛弹琴:法国又"燃烧"了 整个国家地图上到处都在冒烟

体育要闻

升级版杨瀚森再闯难关:当上开拓者第三中锋还得拼

娱乐要闻

庾澄庆罕谈前妻 撕下伊能静仅剩的体面

财经要闻

新一轮大跌源头,找到了!

汽车要闻

星瑞L PLUS限时售价10.97万元起 开启智混3L时代

态度原创

旅游
时尚
本地
家居
数码

旅游要闻

打造移动旅游驿站 满足不同群体需求

秋天衣服要越买越精,准备好这“三衣”,简单舒适又有品味

本地新闻

因新荣记出圈,这座浙东小城才是吃货天堂

家居要闻

2026建博会(广州) 公装联探展交流活动

数码要闻

英伟达否认GeForce RTX 5090停产传闻 称旗舰显卡仍将持续出货

无障碍浏览 进入关怀版