dart语言中的慢速异步递归

Slow asynchronous recursion in the dart language

我发现 dart 语言中的异步递归在以下代码示例中似乎非常慢,我想知道为什么。

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 虚拟机上对此进行测试,所以我无法相信其中涉及计时器,因为它很可能位于浏览器的 js 虚拟机中。

如果 yield * 足够有效,我认为它也可以作为递归函数的替代品,以避免堆栈大小限制。

听起来像下面这个由来已久的问题。我建议您阅读该主题,因为我不认为我可以在这里制作一份简历以使其公正: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);
  });
}