Я обнаружил, что асинхронная рекурсия на языке дартс кажется невероятно медленной в следующем примере кода, и я хотел бы знать, почему.
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 в браузере.
Если бы выход * был достаточно эффективным, я думаю, что он мог бы заменить трамполин для рекурсивной функции, чтобы избежать ограничения размера стека.