之前写过文章介绍了 .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
省流:
不实际发生暂停的 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 正式版了。