我正在学习DART的isolate,阅读the official tutorial.然而,我不明白孤立比async
有什么优势.
为了了解隔离是如何工作的,我编写了以下简单的代码:
import 'dart:isolate';
import 'dart:math';
//generates many random numbers and returns the final result
Future<int> f({required int seed}) async {
const numIter = 100000000;
const upperBound = 10000;
var r = Random(seed);
for (var i = 0; i < numIter; ++i) {
r.nextInt(upperBound); //just discards the result
}
return r.nextInt(upperBound);
}
void main() async {
var sw = Stopwatch();
sw.start();
final future1 = f(seed: 0);
// final future2 = Isolate.run(() async => f(seed: 1));
// final future2 = f(seed: 1);
print(await future1);
// print(await future2);
sw.stop();
print(sw.elapsedMilliseconds.toString() + "(ms)");
}
输出是685(ms)
.
如果我取消这两行的注释,
// final future2 = f(seed: 1);
// print(await future2);
输出变为1338(ms)
,大约是之前的685(ms)
的两倍.由于DART是单线程的(默认情况下只有main isolate),因此这是意料之中的.到目前一切尚好.
然后,如果我取消这两行的注释,
// final future2 = Isolate.run(() async => f(seed: 1));
// print(await future2);
输出变为1304(ms)
.为什么?我预计输出将保持在600(ms)
左右,因为Isolate.run()
引入了另一个执行线程.
Environment:台M1 Macbook.代码通过dart run
命令运行.