| // 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. | |
| // | |
| // This test ensures that there are no long pauses when sending large objects | |
| // via exit/send. | |
| import 'dart:async'; | |
| import 'dart:isolate'; | |
| import 'latency.dart'; | |
| Future<void> main() async { | |
| final statsFuture = measureEventLoopLatency( | |
| const Duration(milliseconds: 1), | |
| 4000, | |
| work: () { | |
| // Every 1 ms we allocate some objects which may trigger GC some time. | |
| for (int i = 0; i < 32; i++) { | |
| List.filled(32 * 1024 ~/ 8, null); | |
| } | |
| }, | |
| ); | |
| final result = await compute(() { | |
| final l = <dynamic>[]; | |
| for (int i = 0; i < 10 * 1000 * 1000; ++i) { | |
| l.add(Object()); | |
| } | |
| return l; | |
| }); | |
| if (result.length != 10 * 1000 * 1000) throw 'failed'; | |
| final stats = await statsFuture; | |
| stats.report('IsolateSendExitLatency'); | |
| } | |
| Future<T> compute<T>(T Function() fun) { | |
| final rp = ReceivePort(); | |
| final sp = rp.sendPort; | |
| Isolate.spawn((_) { | |
| final value = fun(); | |
| Isolate.exit(sp, value); | |
| }, null); | |
| return rp.first.then((t) => t as T); | |
| } |