mirror of
https://github.com/dart-lang/sdk
synced 2024-10-03 00:29:50 +00:00
[benchmarks] Add IsolateRegExp benchmark for regexp passing between isolates.
BUG=https://github.com/dart-lang/sdk/issues/50639 TEST=ci Change-Id: I81bab7c61ce34d1b3a608a1fb0cc7cfd7a2d8e62 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/274120 Reviewed-by: Martin Kustermann <kustermann@google.com> Commit-Queue: Alexander Aprelev <aam@google.com>
This commit is contained in:
parent
acf7a95410
commit
d1a34df210
94
benchmarks/IsolateRegExp/dart/IsolateRegExp.dart
Normal file
94
benchmarks/IsolateRegExp/dart/IsolateRegExp.dart
Normal file
|
@ -0,0 +1,94 @@
|
|||
// 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.
|
||||
//
|
||||
// Measures performance of RegExp reuse between isolates.
|
||||
|
||||
import 'dart:async';
|
||||
import 'dart:isolate';
|
||||
|
||||
import 'package:benchmark_harness/benchmark_harness.dart';
|
||||
|
||||
class SendReceiveRegExp extends AsyncBenchmarkBase {
|
||||
SendReceiveRegExp(String name, this.re) : super(name);
|
||||
|
||||
@override
|
||||
Future<void> run() async {
|
||||
await helper.run(re);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> setup() async {
|
||||
helper = SendReceiveHelper();
|
||||
await helper.setup();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> teardown() async {
|
||||
await helper.finalize();
|
||||
}
|
||||
|
||||
late SendReceiveHelper helper;
|
||||
RegExp re;
|
||||
}
|
||||
|
||||
class SendReceiveHelper {
|
||||
SendReceiveHelper();
|
||||
|
||||
Future<void> setup() async {
|
||||
final port = ReceivePort();
|
||||
inbox = StreamIterator<dynamic>(port);
|
||||
workerExitedPort = ReceivePort();
|
||||
await Isolate.spawn(isolate, port.sendPort,
|
||||
onExit: workerExitedPort.sendPort);
|
||||
await inbox.moveNext();
|
||||
outbox = inbox.current;
|
||||
}
|
||||
|
||||
Future<void> finalize() async {
|
||||
outbox.send(null);
|
||||
await workerExitedPort.first;
|
||||
workerExitedPort.close();
|
||||
inbox.cancel();
|
||||
}
|
||||
|
||||
// Send regexp to worker, get one back, repeat few times.
|
||||
Future<void> run(RegExp re) async {
|
||||
for (int i = 0; i < 5; i++) {
|
||||
outbox.send(re);
|
||||
await inbox.moveNext();
|
||||
re = inbox.current;
|
||||
}
|
||||
}
|
||||
|
||||
late StreamIterator<dynamic> inbox;
|
||||
late SendPort outbox;
|
||||
late ReceivePort workerExitedPort;
|
||||
}
|
||||
|
||||
Future<void> isolate(SendPort sendPort) async {
|
||||
final port = ReceivePort();
|
||||
final inbox = StreamIterator<dynamic>(port);
|
||||
|
||||
sendPort.send(port.sendPort);
|
||||
while (true) {
|
||||
await inbox.moveNext();
|
||||
final received = inbox.current;
|
||||
if (received == null) {
|
||||
break;
|
||||
}
|
||||
// use RegExp to ensure it is compiled
|
||||
RegExp re = received as RegExp;
|
||||
re.firstMatch('h' * 1000);
|
||||
// send the RegExp
|
||||
sendPort.send(re);
|
||||
}
|
||||
port.close();
|
||||
}
|
||||
|
||||
Future<void> main() async {
|
||||
await SendReceiveRegExp('IsolateRegExp.MatchFast', RegExp('h?h')).report();
|
||||
await SendReceiveRegExp('IsolateRegExp.MatchSlow',
|
||||
RegExp(r'(?<=\W|\b|^)(a.? b c.?) ?(\(.*\))?$'))
|
||||
.report();
|
||||
}
|
Loading…
Reference in a new issue