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

你写的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.

相关推荐
热点推荐
殡葬师提醒:亲人刚咽气的10分钟内,必须做对的4件事

殡葬师提醒:亲人刚咽气的10分钟内,必须做对的4件事

宝哥精彩赛事
2026-10-01 21:27:18
女网红开创新模式,用胸部手柄直播打游戏,是低俗还是创意?

女网红开创新模式,用胸部手柄直播打游戏,是低俗还是创意?

新游戏大妹子
2026-09-30 12:29:35
算清经济账!申花搬离八万人成必然,新主场大概率落户金山

算清经济账!申花搬离八万人成必然,新主场大概率落户金山

刘笤说体坛
2026-10-02 06:31:39
亚运男排新格局!3强锁定四强,韩国惨遭绝杀,黑马64年重返四强

亚运男排新格局!3强锁定四强,韩国惨遭绝杀,黑马64年重返四强

舟望停云
2026-10-02 01:38:59
王羲之真迹被毛泽东借走,黄炎培多次催还,毛泽东:你怎么也逼债

王羲之真迹被毛泽东借走,黄炎培多次催还,毛泽东:你怎么也逼债

楚风说历史
2026-08-05 07:25:03
中国最需要驻军的六个城市

中国最需要驻军的六个城市

网观天下
2026-09-30 13:22:07
“数学家”王虹现身纽约,第一次去掉眼镜,她和韦东奕的差别在哪

“数学家”王虹现身纽约,第一次去掉眼镜,她和韦东奕的差别在哪

李昕言温度空间
2026-09-30 20:28:46
0-5惨败!邵佳一道歉:接受一切批评 有些球员还想着亚冠和联赛

0-5惨败!邵佳一道歉:接受一切批评 有些球员还想着亚冠和联赛

念洲
2026-10-02 22:44:09
WTT中国大满贯:国乒3人已止步资格赛!7人率先晋级最终轮

WTT中国大满贯:国乒3人已止步资格赛!7人率先晋级最终轮

全言作品
2026-10-02 22:09:44
钱再多又有何用65岁刘德华的现状,给娱乐圈所有明星敲响警钟

钱再多又有何用65岁刘德华的现状,给娱乐圈所有明星敲响警钟

无人倾听无人倾听
2026-09-17 06:40:37
网传中国第一批高层住宅正集体走向中年危机,多少人瑟瑟发抖…

网传中国第一批高层住宅正集体走向中年危机,多少人瑟瑟发抖…

慧翔百科
2026-09-16 12:09:53
人民币升破6.7!欧美施压逼升值,央妈这一步棋,是主动亮剑

人民币升破6.7!欧美施压逼升值,央妈这一步棋,是主动亮剑

流苏晚晴
2026-10-02 17:36:28
20岁穆欣月成首位亚运电竞女子冠军,夺冠后连发三条社交媒体动态,透露自己已回国并受到隆重接机

20岁穆欣月成首位亚运电竞女子冠军,夺冠后连发三条社交媒体动态,透露自己已回国并受到隆重接机

极目新闻
2026-10-02 16:00:25
三大巨星为争冠集体降薪!库里少拿2070万,詹姆斯收入砍9成更狠

三大巨星为争冠集体降薪!库里少拿2070万,詹姆斯收入砍9成更狠

钱说体育
2026-10-02 22:52:15
我国最长海底公路隧道完成盾构掘进

我国最长海底公路隧道完成盾构掘进

新华社
2026-10-02 13:03:03
许家印的靠山,被起诉了

许家印的靠山,被起诉了

哲空空
2026-05-22 13:40:53
今年火了一种穿法,叫“长裙+长裤”,初秋这么叠穿,时髦又高级

今年火了一种穿法,叫“长裙+长裤”,初秋这么叠穿,时髦又高级

时尚穿搭生活馆
2026-09-30 21:10:39
阿圭罗:梅西带伤还能夺冠!他必须拿今年金球奖!

阿圭罗:梅西带伤还能夺冠!他必须拿今年金球奖!

历史第一人梅西
2026-10-02 23:12:54
英媒重新统计09年以来英超积分榜:剔除曼城成绩曼联可多夺4冠

英媒重新统计09年以来英超积分榜:剔除曼城成绩曼联可多夺4冠

懂球帝
2026-10-02 02:40:07
54岁藤原纪香,从未活在美颜滤镜里

54岁藤原纪香,从未活在美颜滤镜里

草莓解说体育
2026-09-15 06:46:01
2026-10-02 23:27:00
千纸鹤安安
千纸鹤安安
大自然的搬运工
152文章数 3关注度
往期回顾 全部

科技要闻

“分手”15天后,华为与赛力斯签约新五年

头条要闻

邵佳一回应"国足不敌巴勒斯坦":整个团队状态都不在线

头条要闻

邵佳一回应"国足不敌巴勒斯坦":整个团队状态都不在线

体育要闻

30天30队·快船:被莱纳德挂在半空的未来?

娱乐要闻

潘玮柏老婆被猜怀二胎 中秋vlog露馅

财经要闻

珠宝黑马爆雷,老板全家跑路泰国!

汽车要闻

方程豹9月热销破4万 首款皮卡鲨鱼将于四季度上市

态度原创

家居
时尚
亲子
本地
健康

家居要闻

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

伊姐十一热推:电视剧《无可替代》;电视剧《雷霆令》......

亲子要闻

工程车小故事 :开盲盒

本地新闻

中秋逛白塔寺,体验国医妙荟雅集

刷酸祛痘,为什么有人翻车?

无障碍浏览 进入关怀版