#performance #asynchronous #dart #async-await
#Производительность #асинхронный #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;
}
Спасибо!
Ответ №1:
Асинхронные операции имеют накладные расходы. Они создают фьючерсы, подключают слушателей к этим фьючерсам, планируют микрозадачи, асинхронно завершают фьючерсы и т.д. Все это неизбежно требует дополнительного времени и пространства по сравнению с простым возвратом значения в стек, и, кроме того, вы получаете большую задержку, потому что асинхронные операции могут чередоваться с другими операциями.
Асинхронная функция, подобная
Future<int> foo(Future<int> bar()) async {
print("before");
var result = await bar();
print("after");
return resu<
}
эквивалентно функции, записанной как:
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. Даже с учетом накладных расходов, правильно написанная асинхронная программа все равно может быть выполнена быстрее, чем если бы все операции ввода-вывода блокировались. А иногда это не так.
Если ваша программа выполняет ввод-вывод, то, если это не очень специализированная программа, скорее всего, время ввода-вывода будет доминировать над всем остальным