hez2010
V2EX  ›  C#

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

  •  
  •   hez2010 · 9h 56m ago via Android · 702 views

    之前写过文章介绍了 .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://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 正式版了。

    6 replies    2026-08-08 11:27:14 +08:00
    geelaw
        1
    geelaw  
       9h 50m ago
    很强,但是看了截图的表格数据之后:是快了 18.6 、11 、6 、2.2 、6.4 倍,或者速度变成原来的……倍,这些数还没大到 -1 可以忽略,表头的 speedup 也是误导性的陈述。
    hez2010
        2
    hez2010  
    OP
       9h 42m ago via Android
    @geelaw 我直接把原始测试数据扔给 AI 生成的表格,然后 GPT-5.6-Sol 给我整出来了这么个表头。
    liuliuliuliu
        3
    liuliuliuliu  
       1h 51m ago
    大佬,我记得原来.net 有计划支持有栈协程,而且已经实现一部分了,但是为啥后来取消这个计划了?
    hez2010
        4
    hez2010  
    OP
       1h 45m ago via Android
    @liuliuliuliu 因为测试后发现有栈协程性能相比原有的 async 不升反降,自然就没有继续的意义了。
    liuliuliuliu
        5
    liuliuliuliu  
       1h 27m ago
    @hez2010 #4 哦?那这是为什么呢,是因为 .net 体系的原因,还是说有栈协程性能就是不如无栈协程?或者说,go 加入无栈协程是不是还能进一步提升性能?
    hez2010
        6
    hez2010  
    OP
       28 mins ago via Android
    @liuliuliuliu 有栈协程在跨语言调用性能、硬件安全特性兼容性、线程亲和性支持上具有天生劣势,无论在哪个语言都避免不了这些问题。这也是为什么 C++、Rust 等语言明明是后来才加入协程却通通选择无栈协程的原因。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3053 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 03:56 · PVG 11:56 · LAX 20:56 · JFK 23:56
    ♥ Do have faith in what you're doing.