diff --git a/benchmarks/bin/binary_decode_packed.dart b/benchmarks/bin/binary_decode_packed.dart index 5e4d3e35..f640cca4 100644 --- a/benchmarks/bin/binary_decode_packed.dart +++ b/benchmarks/bin/binary_decode_packed.dart @@ -146,13 +146,35 @@ class PackedEnumDecodingBenchmark extends BenchmarkBase { PackedEnumDecodingBenchmark() : super('PackedEnumDecoding') { final rand = Random(123); final message = PackedFields(); - final numEnums = Enum.values.length; + final numEnums = Enum1.values.length; for (var i = 0; i < 1000000; i += 1) { - message.packedEnum.add(Enum.values[rand.nextInt(numEnums)]); + 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); diff --git a/benchmarks/protos/packed_fields.proto b/benchmarks/protos/packed_fields.proto index 2e4f9451..09d32d3b 100644 --- a/benchmarks/protos/packed_fields.proto +++ b/benchmarks/protos/packed_fields.proto @@ -8,13 +8,22 @@ message PackedFields { repeated sint32 packedSint32 = 5 [packed = true]; repeated sint64 packedSint64 = 6 [packed = true]; repeated bool packedBool = 7 [packed = true]; - repeated Enum packedEnum = 8 [packed = true]; + repeated Enum1 packedEnum1 = 8 [packed = true]; + repeated Enum2 packedEnum2 = 9 [packed = true]; } -enum Enum { - ENUM_1 = 0; - ENUM_2 = 1; - ENUM_3 = 2; - ENUM_4 = 4; - ENUM_5 = 5; +enum Enum1 { + ENUM_1_1 = 0; + ENUM_1_2 = 1; + ENUM_1_3 = 2; + ENUM_1_4 = 4; + ENUM_1_5 = 5; +} + +enum Enum2 { + ENUM_2_1 = 0; + ENUM_2_2 = 1; + ENUM_2_3 = 2; + ENUM_2_4 = 4; + ENUM_2_5 = 5; }