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);
});
}
我发现 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);
});
}