| // Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'dart:async'; |
| import 'dart:io'; |
| import 'dart:isolate'; |
| |
| const int count = 10000; |
| |
| // The benchmark will spawn a long chain of isolates, keeping all of them |
| // alive until the last one which measures Rss at that point (i.e. when all |
| // isolates are alive), thereby getting a good estimate of memory-overhead per |
| // isolate. |
| void main() async { |
| final onDone = ReceivePort(); |
| final lastIsolatePort = ReceivePort(); |
| final startRss = ProcessInfo.currentRss; |
| final startUs = DateTime.now().microsecondsSinceEpoch; |
| await Isolate.spawn(worker, WorkerInfo(count, lastIsolatePort.sendPort), |
| onExit: onDone.sendPort); |
| final result = await lastIsolatePort.first as List; |
| final lastIsolateRss = result[0] as int; |
| final lastIsolateUs = result[1] as int; |
| await onDone.first; |
| final doneUs = DateTime.now().microsecondsSinceEpoch; |
| |
| final averageMemoryUsageInKB = (lastIsolateRss - startRss) / count / 1024; |
| final averageStartLatencyInUs = (lastIsolateUs - startUs) / count; |
| final averageFinishLatencyInUs = (doneUs - startUs) / count; |
| |
| print('IsolateBaseOverhead.Rss(MemoryUse): $averageMemoryUsageInKB'); |
| print( |
| 'IsolateBaseOverhead.StartLatency(Latency): $averageStartLatencyInUs us.'); |
| print( |
| 'IsolateBaseOverhead.FinishLatency(Latency): $averageFinishLatencyInUs us.'); |
| } |
| |
| class WorkerInfo { |
| final int id; |
| final SendPort result; |
| |
| WorkerInfo(this.id, this.result); |
| } |
| |
| Future worker(WorkerInfo workerInfo) async { |
| if (workerInfo.id == 1) { |
| workerInfo.result |
| .send([ProcessInfo.currentRss, DateTime.now().microsecondsSinceEpoch]); |
| return; |
| } |
| final onExit = ReceivePort(); |
| await Isolate.spawn(worker, WorkerInfo(workerInfo.id - 1, workerInfo.result), |
| onExit: onExit.sendPort); |
| await onExit.first; |
| } |