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

Dart:返回Future.sync()与无await的async函数差异及性能疑问

Dart中Future.sync()与无await的async函数对比问题

问题背景

我是一名资深开发者,但刚接触Dart学习。我对返回Future.sync()的函数与未使用await的async函数进行了对比测试,测试代码如下:

Future<void> measure(Future<int> Function() func) async {
  final watch = Stopwatch()..start();
  int sum = 0;
  for (int i = 0; i < 10000000; i++) {
    sum += await func();
  }
  print('sum:$sum, dt:${watch.elapsed}');
}

void main() async {
  int i = 0;
  await measure(() => Future<int>.sync(
    () {
      i++;
      return i * 2;
    }
  ));
  i = 0;
  await measure(
    () async {
      i++;
      return i * 2;
    }
  );
}

测试结果如下:

sum:100000010000000, dt:0:00:00.747827
sum:100000010000000, dt:0:00:00.874562

请问这两种写法是否等效?我猜测是等效的,若确实如此,为何后者的运行速度更慢?相关的官方文档可以在哪里找到?


解答

1. 两种写法是否等效?

没错,这两种写法行为上完全等效。它们都会同步执行内部的代码逻辑,执行完成后返回一个已经处于完成状态的Future——不管是通过Future.sync()包装同步代码,还是写一个不含await的async函数,最终的结果和执行时机是一致的。

2. 为什么后者运行速度更慢?

核心差异在于底层实现的开销:

  • Future.sync()是Dart专门为“把同步代码包装成Future”提供的轻量化API,它的逻辑很直接:立即执行传入的函数,捕获返回值或异常,直接生成一个完成态的Future,几乎没有额外的冗余开销。
  • 而async函数,哪怕里面没有await,Dart编译器依然会为它生成一套完整的异步状态机框架。这套框架需要处理潜在的异步切换、异常捕获、上下文保存等逻辑,哪怕用不上,初始化和运行时的额外步骤也会存在。在你百万次调用的场景下,这些微小的开销累积起来,就造成了明显的耗时差距。

3. 相关官方文档在哪里找?

你能在Dart官方文档的异步编程板块找到对应内容:

  • Future.sync()的详细说明:在Future类的API文档中,明确标注了它的用途是同步执行函数并返回完成态的Future,还会对比它和普通Future构造函数的差异。
  • 关于无await的async函数:在Dart的异步编程指南里,有专门章节讲解async函数的编译机制,包括当函数内没有await时的优化行为(但即便有优化,依然会比Future.sync()多一层状态机的开销)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:42:48