Медленная асинхронная рекурсия на языке дартс - PullRequest
0 голосов
/ 28 октября 2019

Я обнаружил, что асинхронная рекурсия на языке дартс кажется невероятно медленной в следующем примере кода, и я хотел бы знать, почему.

import "dart:async";

Stream<int> rec(int z) async* {
  yield z;
  if (z > 0) yield* rec(z - 1);
}

void main() {
  Stream<int> stream = rec(10000);
  stream.listen((int x) {
    if (x % 1000 == 0) print(x);
  });
}

Я тестирую это на dart vm, поэтому я не могу поверить, что задействован таймер, поскольку он, вероятно, находится в js vm в браузере.

Если бы выход * был достаточно эффективным, я думаю, что он мог бы заменить трамполин для рекурсивной функции, чтобы избежать ограничения размера стека.

1 Ответ

1 голос
/ 28 октября 2019

Похоже на следующую проблему, которая имеет долгую историю. Я рекомендую вам прочитать ветку, так как я не думаю, что смогу составить здесь резюме, которое сделает это справедливым: https://github.com/dart-lang/sdk/issues/29189

Я хочу добавить, что ваш пример также может быть написан с использованием sync *, которыенамного быстрее, но, конечно, не асинхронно:

Iterable<int> rec(int z) sync* {
  yield z;
  if (z > 0) yield* rec(z - 1);
}

void main() {
  final stream = rec(10000);
  stream.forEach((int x) {
    if (x % 1000 == 0) print(x);
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...