blob: a09c8bc1a94a5038c5a162bc06bd9298ac8946ba [file] [log] [blame]
// Copyright (c) 2025, 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:math';
import 'dart:typed_data';
import 'package:fixnum/fixnum.dart';
import 'package:protobuf_benchmarks/benchmark_base.dart';
import 'package:protobuf_benchmarks/generated/packed_fields.pb.dart';
PackedFields? sink;
class PackedInt32DecodingBenchmark extends BenchmarkBase {
late final Uint8List encoded;
PackedInt32DecodingBenchmark() : super('PackedInt32Decoding') {
final rand = Random(123);
final message = PackedFields();
for (var i = 0; i < 1000000; i += 1) {
message.packedInt32.add(rand.nextInt(2147483647));
}
encoded = message.writeToBuffer();
}
@override
void run() {
sink = PackedFields()..mergeFromBuffer(encoded);
}
}
class PackedInt64DecodingBenchmark extends BenchmarkBase {
late final Uint8List encoded;
PackedInt64DecodingBenchmark() : super('PackedInt64Decoding') {
final rand = Random(123);
final message = PackedFields();
for (var i = 0; i < 1000000; i += 1) {
// Note: `Random` cannot generate more than the number below.
message.packedInt64.add(Int64(rand.nextInt(4294967296)));
}
encoded = message.writeToBuffer();
}
@override
void run() {
sink = PackedFields()..mergeFromBuffer(encoded);
}
}
class PackedUint32DecodingBenchmark extends BenchmarkBase {
late final Uint8List encoded;
PackedUint32DecodingBenchmark() : super('PackedUint32Decoding') {
final rand = Random(123);
final message = PackedFields();
for (var i = 0; i < 1000000; i += 1) {
message.packedUint32.add(rand.nextInt(4294967295));
}
encoded = message.writeToBuffer();
}
@override
void run() {
sink = PackedFields()..mergeFromBuffer(encoded);
}
}
class PackedUint64DecodingBenchmark extends BenchmarkBase {
late final Uint8List encoded;
PackedUint64DecodingBenchmark() : super('PackedUint64Decoding') {
final rand = Random(123);
final message = PackedFields();
for (var i = 0; i < 1000000; i += 1) {
// Note: `Random` cannot generate more than the number below.
message.packedUint64.add(Int64(rand.nextInt(4294967296)));
}
encoded = message.writeToBuffer();
}
@override
void run() {
sink = PackedFields()..mergeFromBuffer(encoded);
}
}
class PackedSint32DecodingBenchmark extends BenchmarkBase {
late final Uint8List encoded;
PackedSint32DecodingBenchmark() : super('PackedSint32Decoding') {
final rand = Random(123);
final message = PackedFields();
for (var i = 0; i < 1000000; i += 1) {
message.packedSint32.add(rand.nextInt(2147483647));
}
encoded = message.writeToBuffer();
}
@override
void run() {
sink = PackedFields()..mergeFromBuffer(encoded);
}
}
class PackedSint64DecodingBenchmark extends BenchmarkBase {
late final Uint8List encoded;
PackedSint64DecodingBenchmark() : super('PackedSint64Decoding') {
final rand = Random(123);
final message = PackedFields();
for (var i = 0; i < 1000000; i += 1) {
// Note: `Random` cannot generate more than the number below.
message.packedSint64.add(Int64(rand.nextInt(4294967296)));
}
encoded = message.writeToBuffer();
}
@override
void run() {
sink = PackedFields()..mergeFromBuffer(encoded);
}
}
class PackedBoolDecodingBenchmark extends BenchmarkBase {
late final Uint8List encoded;
PackedBoolDecodingBenchmark() : super('PackedBoolDecoding') {
final rand = Random(123);
final message = PackedFields();
for (var i = 0; i < 1000000; i += 1) {
message.packedBool.add(rand.nextBool());
}
encoded = message.writeToBuffer();
}
@override
void run() {
sink = PackedFields()..mergeFromBuffer(encoded);
}
}
class PackedEnumDecodingBenchmark extends BenchmarkBase {
late final Uint8List encoded;
PackedEnumDecodingBenchmark() : super('PackedEnumDecoding') {
final rand = Random(123);
final message = PackedFields();
final numEnums = Enum1.values.length;
for (var i = 0; i < 1000000; i += 1) {
message.packedEnum1.add(Enum1.values[rand.nextInt(numEnums)]);
}
encoded = message.writeToBuffer();
}
@override
void setup() {
// Decode different enums to prevent TFA from specializing enum decoding
// code to one type.
final rand = Random(123);
final message = PackedFields();
for (var i = 0; i < 100; i += 1) {
message.packedEnum1.add(Enum1.values[rand.nextInt(Enum1.values.length)]);
}
for (var i = 0; i < 100; i += 1) {
message.packedEnum2.add(Enum2.values[rand.nextInt(Enum2.values.length)]);
}
final encoded = message.writeToBuffer();
final decoded = PackedFields()..mergeFromBuffer(encoded);
if (decoded.packedEnum1.length != 100) {
throw AssertionError('BUG');
}
if (decoded.packedEnum2.length != 100) {
throw AssertionError('BUG');
}
}
@override
void run() {
sink = PackedFields()..mergeFromBuffer(encoded);
}
}
class PackedSparseEnumDecodingBenchmark extends BenchmarkBase {
late final Uint8List encoded;
PackedSparseEnumDecodingBenchmark() : super('PackedSparseEnumDecoding') {
final rand = Random(123);
final message = PackedFields();
final numEnums = SparseEnum.values.length;
for (var i = 0; i < 1000000; i += 1) {
message.sparseEnum.add(SparseEnum.values[rand.nextInt(numEnums)]);
}
encoded = message.writeToBuffer();
}
@override
void run() {
sink = PackedFields()..mergeFromBuffer(encoded);
}
}
void main() {
PackedInt32DecodingBenchmark().report();
PackedInt64DecodingBenchmark().report();
PackedUint32DecodingBenchmark().report();
PackedUint64DecodingBenchmark().report();
PackedSint32DecodingBenchmark().report();
PackedSint64DecodingBenchmark().report();
PackedBoolDecodingBenchmark().report();
PackedEnumDecodingBenchmark().report();
PackedSparseEnumDecodingBenchmark().report();
if (int.parse('1') == 0) print(sink);
}