之前写过文章介绍了 .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 正式版了。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.