.NET 11 的 async 性能改进过于逆天

发布于

hez2010: 之前写过文章介绍了 .NET 11 推出的 runtime async ,即不再由 C# 编译器把 async 方法编译成状态机,而是直接交由 runtime 处理做代码生成。使用 runtime async 不需要修改已有代码,只需要重新编译一次就行。顺带提一嘴,runtime async 仍然属于无栈协程方案,因此不存在有栈方案的额外开销。

然后正好最近看到关于 runtime async 的几个重要优化都被合并入了上游分支里,于是我把 main 分支代码拉下来构建 runtime,然后用 .NET 11 nightly 开启 runtime async,对比 .NET 10 不开启 runtime async 的性能。

结果如下:( async1 即目前 .NET 10 的 async ,async2 即 .NET 11 将推出的 runtime async )

![result.png](https://i.imgur.com/khZBGp4.png)

测试代码见:[https://gist.github.com/hez2010/d1802e7c7ab10e21a92dcba2afe0a58d](https://gist.github.com/hez2010/d1802e7c7ab10e21a92dcba2afe0a58d)

省流:

- 不实际发生暂停的 async 代码快了 19.6 倍而且变成 0 分配,性能几乎和同步代码没区别了;
- await 已完成的 Task 快了 12 倍,并且也是直接变 0 分配;
- Task.Yield 快了 7 倍;
- ThreadPool continuation 快了 3.2 倍;
- async 状态机链则快了 7.4 倍,同时内存分配减少了 36%。async 的开销几乎被砍的一干二净了。

这还是在针对 runtime async 的代码内联、PGO 之类的支持还没有上线的情况下取得的成绩,等到这些全端上线后,不知道还能有多少提升。

越来越期待 .NET 11 正式版了。

---

原文链接:[点击查看](https://www.v2ex.com/t/1232838)

评论(2)

这提升确实挺猛的,不过仔细看了下楼主的截图,发现对数据严谨性的把控有点漏。表里的倍数其实是 18.6、11、6、2.2 和 6.4 倍,或者说是“速度变成原来的……倍”,因为这分母还不是大到能把 -1 忽略掉,所以说表头标的那个 speedup 在表述上有点误导人了。

· 0 个赞

回复

@geelaw 楼主出来认错,确实是我没细看。当时为了省事直接把跑出来的测试数据扔给 AI 让它自动生成表格,结果 GPT-5.6-Sol 给我整出了这么个误导人的表头,见谅见谅。

· 0 个赞

0.035173s