.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 )

测试代码见:[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)
然后正好最近看到关于 runtime async 的几个重要优化都被合并入了上游分支里,于是我把 main 分支代码拉下来构建 runtime,然后用 .NET 11 nightly 开启 runtime async,对比 .NET 10 不开启 runtime async 的性能。
结果如下:( async1 即目前 .NET 10 的 async ,async2 即 .NET 11 将推出的 runtime async )

测试代码见:[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)
· 0 个赞