Open
Description
This came up here dart-lang/pub#2492
@mkustermann @a-siva
I made a small reproduction:
// bin/spawn.dart
import 'dart:io';
import 'dart:isolate';
main(List<String> args) {
if (args.isNotEmpty && args.first == 'isolate') {
Isolate.spawnUri(Uri.parse('hello.dart'), [], null);
} else {
Process.runSync(Platform.resolvedExecutable,
[Platform.script.resolve('hello.dart').toString()]);
}
}
// bin/hello.dart
main() {
print('hello world');
}
> dart --version
Dart VM version: 2.8.3 (stable) (Tue May 26 18:39:38 2020 +0200) on "macos_x64"
> dart --snapshot=bin/spawn.dart.snapshot ./bin/spawn.dart
> time dart bin/spawn.dart.snapshot isolate
hello world
real 0m0.642s
user 0m0.697s
sys 0m0.113s
> time dart bin/spawn.dart.snapshot
real 0m0.288s
user 0m0.335s
sys 0m0.092s
I would have expected using an isolate would save some time by sharing some amount of resources, or at least be on par with starting a new process.
Using an isolate is slightly faster if I don't snapshot the spawning script.
> time dart bin/spawn.dart
real 0m0.964s
user 0m1.027s
sys 0m0.197s
> time dart bin/spawn.dart isolate
hello world
real 0m0.882s
user 0m0.980s
sys 0m0.163s
This was measured on macos.
On my linux machine using an isolate seems to be faster (note here I use a dev-version, just what I had in my path...):
> dart --version
Dart VM version: 2.9.0-5.0.dev (dev) (Thu Apr 30 13:02:02 2020 +0200) on "linux_x64"
> dart --snapshot=bin/spawn.dart.snapshot ./bin/spawn.dart
> /usr/bin/time dart bin/spawn.dart.snapshot isolate
hello world
0.25user 0.15system 0:00.28elapsed 141%CPU (0avgtext+0avgdata 127504maxresident)k
0inputs+0outputs (0major+22664minor)pagefaults 0swaps
> /usr/bin/time dart bin/spawn.dart.snapshot
0.37user 0.15system 0:00.34elapsed 153%CPU (0avgtext+0avgdata 122164maxresident)k
0inputs+0outputs (0major+27981minor)pagefaults 0swaps