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

.NET9新方法终结十年循环:5000个任务内存从110MB降到1.3MB

0
分享至

  上周我审批了一个拉取请求,里面同时扇出六个 HTTP 调用,再用那种从 2015 年就开始写的循环把结果一个个收回来:把所有异步操作丢进 List,一个 while 配上 WhenAny,Remove 掉先完成的那个、处理、继续。我眼皮都没眨就点了通过。

  一个小时后才猛然意识到,runtime 从 .NET 9 起就内置了 WhenEach,它存在的意义正是把这个循环彻底删掉。然而,代码作者和我,一个都没切过去。

  

  于是我做了自己最近对旧习惯常干的事:给它们掐个表。

  你大概率今天还在写这个循环

  它长这样:

  var pending = new List>(tasks);while (pending.Count > 0)var done = await Task.WhenAny(pending);pending.Remove(done);sum += await done;}

  这个循环之所以存在,是因为 WhenAll 只有一条死规矩:所有任务不全部完成,一个结果都别想用。假设一个仪表板界面要并排取五个服务的数据,那趟 150 毫秒的用户画像调用,必须等到那趟 1200 毫秒的遗留定价接口返回,才算数。挨个收结果的循环恰好解决了这个问题:谁先回来先给谁。而 WhenEach 干的就是同一件事,并且只需要三行。

  我们把五个模拟服务调用抽成一个方法:

  static Task[] FanOut() =>Call("profile", 150),Call("orders", 300),Call("recs", 500),Call("inventory", 800),Call("legacy-pricing", 1_200),];

  先用 WhenAll 跑一遍:

  var all = await Task.WhenAll(FanOut()); // 所有人等着

  打印结果是,五个结果在 1204 毫秒处一次性可用。换成 WhenEach:

  await foreach (var t in Task.WhenEach(FanOut())) // 谁先完先给谁Console.WriteLine($"{await t} usable at {sw.ElapsedMilliseconds} ms");

  打印出来就是:用户画像在 150 毫秒可用,订单在 298 毫秒,推荐在 499 毫秒,库存在 799 毫秒,遗留定价在 1198 毫秒。这些延时是模拟的 Delay 调用,时间当然长得严丝合缝,要看的其实是“形状”,不是具体毫秒数。WhenEach 返回的是 IAsyncEnumerable,每个任务刚完成的那一瞬间就被 yield 出来——跟我们手写的 drain loop 一模一样的形状。正因如此,所有人都在手写那个循环。

  旧循环到底有多贵

  这部分我从来就没量过。每一轮迭代,都要拿“还活着的列表”调用一次 WhenAny。WhenAny 会把那个列表复制到一个新数组里,再给每个还没收摊的任务挂上一个回调。下一轮迭代又把 n-1 个任务的列表重新拷贝、重新挂回调,再下一轮是 n-2。假如扇出 5000 个任务,WhenAny 这条路径大约会注册 1250 万个回调。别忘了,List.Remove 本身还是线性扫描。这个循环悄悄呈现平方级开销。

  我准备了完全相同的 5000 个任务(随机 1 到 50 毫秒延时,固定随机种子以保证每种策略干的是同一份活),用三种方式收割。环境是 .NET 10、Release 编译、一台小规格的 Linux 云容器。

  下边是一次比较典型的实测结果:

  WhenAll(基准):耗时 57 ms,CPU 时间 22 ms,分配 1.4 MB

  WhenEach:耗时 50 ms,CPU 时间 18 ms,分配 1.3 MB

  WhenAny drain 循环:耗时 470 ms,CPU 时间 310 ms,分配 110 MB

  看到 110 MB 的那个数字时,我差点把咖啡喷到屏幕上。同样的任务,同样的完成顺序,仅仅因为那个看似无害的 while 循环,内存开销暴涨了八十多倍。CPU 时间也慢了十几倍。

  而新方法用起来不过就是把 `Task.WhenAll` 换成 `Task.WhenEach`,再套一个 `await foreach`,就这么简单。十年养成的习惯,三行代码就能扔掉,顺带把内存和 CPU 一起省下来。

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

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.

相关推荐
热点推荐
“最年轻的第一夫人”,出任总统

“最年轻的第一夫人”,出任总统

中国新闻周刊
2026-07-31 14:34:35
他是CBA现役最老球员,打了20年拿5冠身价过亿,周鹏竟是亲妹夫

他是CBA现役最老球员,打了20年拿5冠身价过亿,周鹏竟是亲妹夫

寒士之言本尊
2026-08-01 15:08:03
今年还会热多久?8月7日立秋之后会凉快吗?2026年出伏时间表出炉了!

今年还会热多久?8月7日立秋之后会凉快吗?2026年出伏时间表出炉了!

小谈食刻美食
2026-08-01 09:41:27
阿斯:姆巴佩第三个皇马赛季急需夺冠,拿到职业生涯首座金球

阿斯:姆巴佩第三个皇马赛季急需夺冠,拿到职业生涯首座金球

懂球帝
2026-08-01 14:50:09
刘德华经纪公司要求四川一家"刘德华板鸭"店撤销商标,七十岁的老板很无奈:"我从小就叫刘德华,一直没改过名字啊..."

刘德华经纪公司要求四川一家"刘德华板鸭"店撤销商标,七十岁的老板很无奈:"我从小就叫刘德华,一直没改过名字啊..."

品牌头版
2026-08-01 08:28:20
四天四破纪录,东北人:头回见夜里30度!重庆成了“避暑中心”?

四天四破纪录,东北人:头回见夜里30度!重庆成了“避暑中心”?

芳芳历史烩
2026-08-01 09:49:05
乒超联赛:女团4强诞生!孙颖莎休战卫冕冠军出局,蒯曼、陈幸同率队排第一

乒超联赛:女团4强诞生!孙颖莎休战卫冕冠军出局,蒯曼、陈幸同率队排第一

全言作品
2026-08-01 13:36:49
1938年,国军上将钱大钧径直闯入军统湖北站,当众枪杀副站长杨若琛,环视在场特务厉声喝道:谁敢告黑状,这就是结局!

1938年,国军上将钱大钧径直闯入军统湖北站,当众枪杀副站长杨若琛,环视在场特务厉声喝道:谁敢告黑状,这就是结局!

唠叨说历史
2026-07-27 17:28:12
比董卿知性、比周涛漂亮、比海霞优秀,如今39岁未婚育,一心工作

比董卿知性、比周涛漂亮、比海霞优秀,如今39岁未婚育,一心工作

胡一舸南游y
2026-07-31 19:13:51
政治局:全面从严治党面临许多新情况新问题

政治局:全面从严治党面临许多新情况新问题

刘胜军经济学大局观
2026-07-31 22:10:42
中国最大的蚊子工厂,用羊血喂养蚊子,每个月释放3000万只

中国最大的蚊子工厂,用羊血喂养蚊子,每个月释放3000万只

抽象派大师
2026-07-31 18:56:27
比亚迪“海獭”让日本人破防了

比亚迪“海獭”让日本人破防了

DearAuto
2026-07-29 20:20:03
快讯!这次轮到中国立规矩了!

快讯!这次轮到中国立规矩了!

故事终将光明磊落
2026-08-01 08:21:54
欧美中产正扎堆去泰国“等死”?清迈芭提雅,悄悄变成人生终点站

欧美中产正扎堆去泰国“等死”?清迈芭提雅,悄悄变成人生终点站

无人倾听无人倾听
2026-07-21 03:34:36
第二批全国零售业创新提升试点城市:湖北襄阳宜昌入选

第二批全国零售业创新提升试点城市:湖北襄阳宜昌入选

极目新闻
2026-08-01 11:56:05
7月,股民人均亏1.4万!主力为了套住我,竟然让全球科技股暴涨...

7月,股民人均亏1.4万!主力为了套住我,竟然让全球科技股暴涨...

金石随笔
2026-08-01 01:35:35
8月7日立秋,今年立秋是“闭眼秋”,老辈说的“闭眼秋”是什么意思?是好还是坏?

8月7日立秋,今年立秋是“闭眼秋”,老辈说的“闭眼秋”是什么意思?是好还是坏?

小谈食刻美食
2026-07-29 07:59:35
首个月销破10万辆的新势力出现了

首个月销破10万辆的新势力出现了

第一财经资讯
2026-08-01 11:14:40
桃子正大量上市,提醒:二者万不可同食,夏天吃桃子也有禁忌,要学会忌嘴!

桃子正大量上市,提醒:二者万不可同食,夏天吃桃子也有禁忌,要学会忌嘴!

小谈食刻美食
2026-07-31 08:05:53
舆论哗然!蔡崇信夫妇离婚,厘清3个关键视角:体面分手还是资本博弈

舆论哗然!蔡崇信夫妇离婚,厘清3个关键视角:体面分手还是资本博弈

火山詩话
2026-08-01 08:11:53
2026-08-01 16:07:00
字节漫游指南
字节漫游指南
有态度网友ytd
361文章数 101关注度
往期回顾 全部

科技要闻

特斯拉拆不掉中国制造

头条要闻

少年捐日军罪证遭“销户”威胁 警方最新回应

头条要闻

少年捐日军罪证遭“销户”威胁 警方最新回应

体育要闻

蔡崇信夫妇决定离婚!结束30年婚姻

娱乐要闻

周星驰质疑董宇辉看《大话西游》500遍

财经要闻

宇树造富盛宴:王兴兴将跻身百亿富豪

汽车要闻

听劝!换回机械门把手,这才是碳基生物该开的车!

态度原创

家居
健康
时尚
数码
公开课

家居要闻

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

中风易复发!谈中风康复与二级预防

一穿就显瘦,她这身搭配我爱了

数码要闻

采用OLED屏幕 iPad Air外观或将于明年正式调整

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版