【问题标题】:Dart - Async vs Sync performance considerationsDart - 异步与同步性能注意事项
【发布时间】:2020-09-16 16:58:22
【问题描述】:

使用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;
}

谢谢!

【问题讨论】:

    标签: performance asynchronous dart async-await


    【解决方案1】:

    异步操作确实有开销。他们创建期货,将监听器附加到这些期货,安排微任务,异步完成期货等。所有这些都不可避免地需要额外的时间和空间,而不是仅仅在堆栈上返回一个值,最重要的是,你也会得到更多的延迟,因为异步操作可能与其他操作交错。

    类似的异步函数

    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;
    }
    

    编译器尝试制作类似的东西(但可能不如手工重写)。所有这些额外的未来管理对于异步函数来说都是必要的开销。

    这也是异步的优点:您可以在等待时做其他事情,fx,I/O 操作。即使有开销,一个正确编写的异步程序仍然可以比所有 I/O 操作都阻塞更快地完成。有时不是。

    如果您的程序执行 I/O,那么除非它是一个非常专业的程序,否则 I/O 时间很可能会支配其他一切

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      相关资源
      最近更新 更多