blob: 984d8aad212d0d85202babb35e7b27e1bd068cf3 [file] [log] [blame]
import 'dart:math';
import 'dart:typed_data';
import 'package:bazel_worker/bazel_worker.dart';
import 'package:bazel_worker/src/async_message_grouper.dart';
/// Benchmark for `AsyncMessageGrouper`.
Future<void> main() async {
// Create a large work request with 10,000 inputs.
var workRequest = WorkRequest();
for (var i = 0; i != 10000; ++i) {
var path = 'blaze-bin/some/path/to/a/file/that/is/an/input/$i';
workRequest
..arguments.add('--input=$path')
..inputs.add(Input()
..path = ''
..digest.addAll(List.filled(70, 0x11)));
}
// Serialize it.
var requestBytes = workRequest.writeToBuffer();
var length = requestBytes.length;
print('Request has $length requestBytes.');
// Add the length in front base 128 encoded as in the worker protocol.
requestBytes =
Uint8List.fromList(requestBytes.toList()..insertAll(0, _varInt(length)));
// Split into 10000 byte chunks.
var lists = <Uint8List>[];
for (var i = 0; i < requestBytes.length; i += 10000) {
lists.add(Uint8List.sublistView(
requestBytes, i, min(i + 10000, requestBytes.length)));
}
// Time `AsyncMessageGrouper` and deserialization.
for (var i = 0; i != 30; ++i) {
var stopwatch = Stopwatch()..start();
var asyncGrouper = AsyncMessageGrouper(Stream.fromIterable(lists));
var message = (await asyncGrouper.next)!;
print('Grouped in ${stopwatch.elapsedMilliseconds}ms');
stopwatch.reset();
WorkRequest.fromBuffer(message);
print('Deserialized in ${stopwatch.elapsedMilliseconds}ms');
}
}
Uint8List _varInt(int value) {
var result = <int>[];
while (value >= 0x80) {
result.add(0x80 | (value & 0x7f));
value >>= 7;
}
result.add(value);
return Uint8List.fromList(result);
}