Dart - 异步 vs 同步性能考虑

3

使用 async/await 进行开发会让异步方法遍布我的代码。这让我产生了疑问:这些调用之间有什么不同吗?性能方面呢?

class SomeClass{}

//Sync return
SomeClass syncMethod(){
  return SomeClass();
}

//Immediate async return
Future<SomeClass> asyncMethod() async{
  return SomeClass();
}

//Await an immediate async return
Future<SomeClass> otherAsyncMethod() async{
  SomeClass someClass = await asyncMethod();
  return someClass;
}

感谢您!
1个回答

2

异步操作确实会有开销。它们会创建 futures,将监听器附加到这些 futures 上,安排微任务,异步完成 futures 等等。所有这些都不可避免地需要额外的时间和空间,而且除此之外,由于异步操作可能与其他操作交错执行,因此还会增加更多的延迟。

像下面这样的异步函数

Future<int> foo(Future<int> bar()) async {
  print("before");
  var result = await bar();
  print("after");
  return result;
}

等同于如下所示的函数:

Future<int> foo(Future<int> bar()) {
  var $c = Completer<int>();
  print("before");
  bar().then((int result) {
    print("after");
    $c.complete(result);
  }, onError: (e, s) {
    $c.completeError(e, s);
  });
  return $c.future;
}

编译器会尝试生成类似的代码(但可能不如手动重写好)。所有这些额外的未来管理对于异步函数来说是必要的开销。
这也是异步性的优势所在:在等待 I/O 操作时,您可以同时做其他事情。即使有开销,一个正确编写的异步程序仍然可以比所有 I/O 操作都是阻塞的情况下更快地完成。但有时候不是这样的。
如果您的程序涉及 I/O,则除非它是一个非常专业化的程序,否则 I/O 时间将主导一切。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接