【问题标题】: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 时间很可能会支配其他一切