Dart — асинхронный против соображений производительности синхронизации

#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. Даже с учетом накладных расходов, правильно написанная асинхронная программа все равно может быть выполнена быстрее, чем если бы все операции ввода-вывода блокировались. А иногда это не так.

Если ваша программа выполняет ввод-вывод, то, если это не очень специализированная программа, скорее всего, время ввода-вывода будет доминировать над всем остальным