Dart-异步与同步性能注意事项



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

谢谢!

异步操作确实有开销。它们创建未来,将侦听器连接到这些未来,调度微任务,异步完成未来,等等。所有这些不可避免地需要额外的时间和空间,而不仅仅是在堆栈上返回一个值,除此之外,您还会获得更多的延迟,因为异步操作可能会与其他操作交错。

类似的异步函数

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时间很可能会主导的其他一切

最新更新