Merge branch 'sparse_enum_benchmarks' into improve_enum_decoding_2
diff --git a/benchmarks/bin/binary_decode_packed.dart b/benchmarks/bin/binary_decode_packed.dart
index f640cca..a09c8bc 100644
--- a/benchmarks/bin/binary_decode_packed.dart
+++ b/benchmarks/bin/binary_decode_packed.dart
@@ -181,6 +181,25 @@
}
}
+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();
@@ -190,6 +209,7 @@
PackedSint64DecodingBenchmark().report();
PackedBoolDecodingBenchmark().report();
PackedEnumDecodingBenchmark().report();
+ PackedSparseEnumDecodingBenchmark().report();
if (int.parse('1') == 0) print(sink);
}
diff --git a/benchmarks/protos/packed_fields.proto b/benchmarks/protos/packed_fields.proto
index 09d32d3..18f7639 100644
--- a/benchmarks/protos/packed_fields.proto
+++ b/benchmarks/protos/packed_fields.proto
@@ -10,6 +10,7 @@
repeated bool packedBool = 7 [packed = true];
repeated Enum1 packedEnum1 = 8 [packed = true];
repeated Enum2 packedEnum2 = 9 [packed = true];
+ repeated SparseEnum sparseEnum = 10 [packed = true];
}
enum Enum1 {
@@ -27,3 +28,23 @@
ENUM_2_4 = 4;
ENUM_2_5 = 5;
}
+
+// An enum with large gaps between the known values, and with negative values.
+//
+// This will be slower to decode as the varint to enum value mapping needs to be
+// done with binary search, or map lookup etc.
+enum SparseEnum {
+ ENUM_ZERO = 0;
+ ENUM_MIN_INT = -2147483648;
+ ENUM_1 = -1000000000;
+ ENUM_2 = -100000000;
+ ENUM_3 = -10000000;
+ ENUM_4 = -1000000;
+ ENUM_5 = -100000;
+ ENUM_6 = 100000;
+ ENUM_7 = 1000000;
+ ENUM_8 = 10000000;
+ ENUM_9 = 100000000;
+ ENUM_10 = 1000000000;
+ ENUM_MAX_INT = 2147483647;
+}