You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么Dart中async关键字会导致代码执行性能大幅下降?

Dart async函数性能差异成因(编译器层面)
  • 异步函数的代码转换逻辑
    Dart编译器处理带async关键字的函数时,无论函数内是否使用await,都会将函数整体转换为支持暂停/恢复的协程结构:所有局部变量会被装箱到堆分配的*SuspendState(挂起状态)*对象中,而非普通同步函数那样直接分配在调用栈上。你代码中的循环变量i在同步函数中是栈上的标量值,读写速度极快;但在async函数中,每次i++都需要先访问堆上的状态对象,再读写对应的整数字段,堆内存访问的延迟本来就远高于栈内存,直接导致循环执行速度下降。
  • 编译器优化限制
    普通同步函数的优化空间远大于async函数:JIT/AOT编译器可以对同步函数的循环做大量激进优化,比如将循环变量i缓存到CPU寄存器中,甚至做循环展开、常量折叠等优化。但async函数因为要支持任意位置的await挂起后恢复上下文,编译器无法确定后续会不会有挂起点修改i的取值,因此不敢做这类激进优化,只能每次都从堆内存读写i的值,进一步放大了性能差距。
  • 验证方法
    你可以做两个简单测试验证上述逻辑:
    1. 将两段代码的循环变量i改为全局变量,你会发现普通同步函数的执行速度会降到和async函数接近的水平,因为全局变量也是堆分配,无法享受栈变量的优化福利。
    2. 将async函数中的循环逻辑抽成独立的同步函数调用,你会发现执行速度会回到和第一段代码几乎一致的水平,因为同步函数内的局部变量仍然可以享受栈分配和激进优化。

内容的提问来源于stack exchange,提问作者TSR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:06:04