blob: 3ca1be242cc978072e59a4e51996baf5392ac5b0 [file] [log] [blame]
// Copyright (c) 2019, 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.
// VMOptions=--enable-isolate-groups
// VMOptions=--no-enable-isolate-groups
import 'dart:async';
import 'dart:isolate';
import 'dart:math';
import 'dart:typed_data';
import 'package:async_helper/async_helper.dart' show asyncStart, asyncEnd;
import 'package:expect/expect.dart';
Uint8List generateSampleList(final int size) {
final list = Uint8List(size);
for (int i = 0; i < size; i++) {
list[i] = i % 243;
}
return list;
}
void validateReceivedList(final int expectedSize, final list) {
Expect.equals(expectedSize, list.length);
// probe few elements
for (int i = 0;
i < list.length;
i += max<num>(1, expectedSize ~/ 1000) as int) {
Expect.equals(i % 243, list[i]);
}
}
Future<Null> testSend(
bool transferable, int toIsolateSize, int fromIsolateSize) async {
asyncStart();
final port = ReceivePort();
final inbox = StreamIterator(port);
await Isolate.spawn(isolateMain,
[transferable, toIsolateSize, fromIsolateSize, port.sendPort]);
await inbox.moveNext();
final outbox = inbox.current;
final workWatch = Stopwatch();
final data = generateSampleList(toIsolateSize);
int count = 10;
workWatch.start();
while (count-- > 0) {
outbox.send(transferable ? TransferableTypedData.fromList([data]) : data);
await inbox.moveNext();
validateReceivedList(
fromIsolateSize,
transferable
? inbox.current.materialize().asUint8List()
: inbox.current);
}
print('total ${workWatch.elapsedMilliseconds}ms');
outbox.send(null);
port.close();
asyncEnd();
}
main() async {
asyncStart();
int bignum = 10 * 1000 * 1000;
await testSend(false, bignum, 1); // none
await testSend(true, bignum, 1); // 31959tr
await testSend(false, bignum, 1); // 31960
await testSend(true, bignum, 1); // 31960tr
asyncEnd();
}
Future<Null> isolateMain(List config) async {
bool transferable = config[0];
int toIsolateSize = config[1];
int fromIsolateSize = config[2];
SendPort outbox = config[3];
final port = ReceivePort();
final inbox = StreamIterator(port);
outbox.send(port.sendPort);
final data = generateSampleList(fromIsolateSize);
while (true) {
await inbox.moveNext();
if (inbox.current == null) {
break;
}
validateReceivedList(
toIsolateSize,
transferable
? inbox.current.materialize().asUint8List()
: inbox.current);
outbox.send(transferable ? TransferableTypedData.fromList([data]) : data);
}
port.close();
}