Skip to content

Commit 41eba19

Browse files
authored
Add sinks to benchmarks to prevent smart tools eliminating benchmarked code (#1040)
In `binary_decode_packed` benchmarks we used "sink" variables to write the decoded values, and printed these sinks at the end to make sure they're not dropped. Do the same in the rest of the benchmarks to make sure no code is eliminated by a sufficiently smart compiler or VM. Just as a sanity check I compared the numbers before and after this change, when compiled to Wasm with `-O2`. The numbers do not change in a consistent (reproducible) and significant way. It's still good to be safe and use the benchmark results to avoid dropping code.
1 parent 3ccc8ab commit 41eba19

15 files changed

+186
-45
lines changed

benchmarks/bin/from_binary.dart

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ import 'package:protobuf_benchmarks/generated/google_message1_proto3.pb.dart'
1111
as p3;
1212
import 'package:protobuf_benchmarks/generated/google_message2.pb.dart';
1313
import 'package:protobuf_benchmarks/readfile.dart';
14+
import 'package:protobuf/protobuf.dart';
15+
16+
GeneratedMessage? sink1;
17+
GeneratedMessage? sink2;
18+
GeneratedMessage? sink3;
1419

1520
class Benchmark extends BenchmarkBase {
1621
final Uint8List _message1Proto2Input;
@@ -28,9 +33,9 @@ class Benchmark extends BenchmarkBase {
2833

2934
@override
3035
void run() {
31-
p2.GoogleMessage1.fromBuffer(_message1Proto2Input);
32-
p3.GoogleMessage1.fromBuffer(_message1Proto3Input);
33-
GoogleMessage2.fromBuffer(_message2Input);
36+
sink1 = p2.GoogleMessage1.fromBuffer(_message1Proto2Input);
37+
sink2 = p3.GoogleMessage1.fromBuffer(_message1Proto3Input);
38+
sink3 = GoogleMessage2.fromBuffer(_message2Input);
3439
}
3540
}
3641

@@ -48,4 +53,10 @@ void main() {
4853
message1Proto3Input,
4954
message2Input,
5055
).report();
56+
57+
if (int.parse('1') == 0) {
58+
print(sink1);
59+
print(sink2);
60+
print(sink3);
61+
}
5162
}

benchmarks/bin/from_json_string.dart

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ import 'package:protobuf_benchmarks/generated/google_message1_proto3.pb.dart'
99
as p3;
1010
import 'package:protobuf_benchmarks/generated/google_message2.pb.dart';
1111
import 'package:protobuf_benchmarks/readfile.dart';
12+
import 'package:protobuf/protobuf.dart';
13+
14+
GeneratedMessage? sink1;
15+
GeneratedMessage? sink2;
16+
GeneratedMessage? sink3;
1217

1318
class Benchmark extends BenchmarkBase {
1419
final String _message1Proto2JsonString;
@@ -29,9 +34,9 @@ class Benchmark extends BenchmarkBase {
2934

3035
@override
3136
void run() {
32-
p2.GoogleMessage1.fromJson(_message1Proto2JsonString);
33-
p3.GoogleMessage1.fromJson(_message1Proto3JsonString);
34-
GoogleMessage2.fromJson(_message2JsonString);
37+
sink1 = p2.GoogleMessage1.fromJson(_message1Proto2JsonString);
38+
sink2 = p3.GoogleMessage1.fromJson(_message1Proto3JsonString);
39+
sink3 = GoogleMessage2.fromJson(_message2JsonString);
3540
}
3641
}
3742

@@ -49,4 +54,10 @@ void main() {
4954
message1Proto3Input,
5055
message2Input,
5156
).report();
57+
58+
if (int.parse('1') == 0) {
59+
print(sink1);
60+
print(sink2);
61+
print(sink3);
62+
}
5263
}

benchmarks/bin/from_proto3_json_object.dart

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ import 'package:protobuf_benchmarks/generated/google_message1_proto3.pb.dart'
99
as p3;
1010
import 'package:protobuf_benchmarks/generated/google_message2.pb.dart';
1111
import 'package:protobuf_benchmarks/readfile.dart';
12+
import 'package:protobuf/protobuf.dart';
13+
14+
GeneratedMessage? sink1;
15+
GeneratedMessage? sink2;
16+
GeneratedMessage? sink3;
1217

1318
class Benchmark extends BenchmarkBase {
1419
final Object? _message1Proto2Proto3JsonObject;
@@ -29,13 +34,14 @@ class Benchmark extends BenchmarkBase {
2934

3035
@override
3136
void run() {
32-
p2.GoogleMessage1.create().mergeFromProto3Json(
33-
_message1Proto2Proto3JsonObject,
34-
);
35-
p3.GoogleMessage1.create().mergeFromProto3Json(
36-
_message1Proto3Proto3JsonObject,
37-
);
38-
GoogleMessage2.create().mergeFromProto3Json(_message2Proto3JsonObject);
37+
sink1 =
38+
p2.GoogleMessage1.create()
39+
..mergeFromProto3Json(_message1Proto2Proto3JsonObject);
40+
sink2 =
41+
p3.GoogleMessage1.create()
42+
..mergeFromProto3Json(_message1Proto3Proto3JsonObject);
43+
sink3 =
44+
GoogleMessage2.create()..mergeFromProto3Json(_message2Proto3JsonObject);
3945
}
4046
}
4147

@@ -53,4 +59,10 @@ void main() {
5359
message1Proto3Input,
5460
message2Input,
5561
).report();
62+
63+
if (int.parse('1') == 0) {
64+
print(sink1);
65+
print(sink2);
66+
print(sink3);
67+
}
5668
}

benchmarks/bin/from_proto3_json_string.dart

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ import 'package:protobuf_benchmarks/generated/google_message1_proto3.pb.dart'
1111
as p3;
1212
import 'package:protobuf_benchmarks/generated/google_message2.pb.dart';
1313
import 'package:protobuf_benchmarks/readfile.dart';
14+
import 'package:protobuf/protobuf.dart';
15+
16+
GeneratedMessage? sink1;
17+
GeneratedMessage? sink2;
18+
GeneratedMessage? sink3;
1419

1520
class Benchmark extends BenchmarkBase {
1621
final String _message1Proto2Proto3JsonString;
@@ -34,15 +39,15 @@ class Benchmark extends BenchmarkBase {
3439

3540
@override
3641
void run() {
37-
p2.GoogleMessage1.create().mergeFromProto3Json(
38-
jsonDecode(_message1Proto2Proto3JsonString),
39-
);
40-
p3.GoogleMessage1.create().mergeFromProto3Json(
41-
jsonDecode(_message1Proto3Proto3JsonString),
42-
);
43-
GoogleMessage2.create().mergeFromProto3Json(
44-
jsonDecode(_message2Proto3JsonString),
45-
);
42+
sink1 =
43+
p2.GoogleMessage1.create()
44+
..mergeFromProto3Json(jsonDecode(_message1Proto2Proto3JsonString));
45+
sink2 =
46+
p3.GoogleMessage1.create()
47+
..mergeFromProto3Json(jsonDecode(_message1Proto3Proto3JsonString));
48+
sink3 =
49+
GoogleMessage2.create()
50+
..mergeFromProto3Json(jsonDecode(_message2Proto3JsonString));
4651
}
4752
}
4853

@@ -60,4 +65,10 @@ void main() {
6065
message1Proto3Input,
6166
message2Input,
6267
).report();
68+
69+
if (int.parse('1') == 0) {
70+
print(sink1);
71+
print(sink2);
72+
print(sink3);
73+
}
6374
}

benchmarks/bin/hash_code.dart

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ import 'package:protobuf_benchmarks/generated/google_message1_proto3.pb.dart'
1010
import 'package:protobuf_benchmarks/generated/google_message2.pb.dart';
1111
import 'package:protobuf_benchmarks/readfile.dart';
1212

13+
int sink1 = 0;
14+
int sink2 = 0;
15+
int sink3 = 0;
16+
1317
class Benchmark extends BenchmarkBase {
1418
final p2.GoogleMessage1 _message1Proto2;
1519
final p3.GoogleMessage1 _message1Proto3;
@@ -26,9 +30,9 @@ class Benchmark extends BenchmarkBase {
2630

2731
@override
2832
void run() {
29-
_message1Proto2.hashCode;
30-
_message1Proto3.hashCode;
31-
_message2.hashCode;
33+
sink1 = _message1Proto2.hashCode;
34+
sink2 = _message1Proto3.hashCode;
35+
sink3 = _message2.hashCode;
3236
}
3337
}
3438

@@ -46,4 +50,10 @@ void main() {
4650
message1Proto3Input,
4751
message2Input,
4852
).report();
53+
54+
if (int.parse('1') == 0) {
55+
print(sink1);
56+
print(sink2);
57+
print(sink3);
58+
}
4959
}

benchmarks/bin/query_decode_binary.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
import 'package:protobuf_benchmarks/benchmark_base.dart';
66
import 'package:protobuf_benchmarks/generated/f0.pb.dart' as f0;
77
import 'package:protobuf_benchmarks/readfile.dart';
8+
import 'package:protobuf/protobuf.dart';
9+
10+
GeneratedMessage? sink;
811

912
class Benchmark extends BenchmarkBase {
1013
final List<int> _input;
@@ -13,11 +16,15 @@ class Benchmark extends BenchmarkBase {
1316

1417
@override
1518
void run() {
16-
f0.A0.fromBuffer(_input);
19+
sink = f0.A0.fromBuffer(_input);
1720
}
1821
}
1922

2023
void main() {
2124
final List<int> encoded = readfile('datasets/query_benchmark.pb');
2225
Benchmark('query_decode_binary', encoded).report();
26+
27+
if (int.parse('1') == 0) {
28+
print(sink);
29+
}
2330
}

benchmarks/bin/query_decode_json.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
import 'package:protobuf_benchmarks/benchmark_base.dart';
66
import 'package:protobuf_benchmarks/generated/f0.pb.dart' as f0;
77
import 'package:protobuf_benchmarks/readfile.dart';
8+
import 'package:protobuf/protobuf.dart';
9+
10+
GeneratedMessage? sink;
811

912
class Benchmark extends BenchmarkBase {
1013
final String _input;
@@ -14,11 +17,15 @@ class Benchmark extends BenchmarkBase {
1417

1518
@override
1619
void run() {
17-
f0.A0.fromJson(_input);
20+
sink = f0.A0.fromJson(_input);
1821
}
1922
}
2023

2124
void main() {
2225
final List<int> encoded = readfile('datasets/query_benchmark.pb');
2326
Benchmark('query_decode_json', encoded).report();
27+
28+
if (int.parse('1') == 0) {
29+
print(sink);
30+
}
2431
}

benchmarks/bin/query_encode_binary.dart

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,26 @@ import 'package:protobuf_benchmarks/benchmark_base.dart';
66
import 'package:protobuf_benchmarks/generated/f0.pb.dart' as f0;
77
import 'package:protobuf_benchmarks/readfile.dart';
88

9+
import 'dart:typed_data';
10+
11+
Uint8List? sink;
12+
913
class Benchmark extends BenchmarkBase {
1014
final f0.A0 _input;
1115

1216
Benchmark(super.name, List<int> input) : _input = f0.A0.fromBuffer(input);
1317

1418
@override
1519
void run() {
16-
_input.writeToBuffer();
20+
sink = _input.writeToBuffer();
1721
}
1822
}
1923

2024
void main() {
2125
final List<int> encoded = readfile('datasets/query_benchmark.pb');
2226
Benchmark('query_encode_binary', encoded).report();
27+
28+
if (int.parse('1') == 0) {
29+
print(sink);
30+
}
2331
}

benchmarks/bin/query_encode_json.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,24 @@ import 'package:protobuf_benchmarks/benchmark_base.dart';
66
import 'package:protobuf_benchmarks/generated/f0.pb.dart' as f0;
77
import 'package:protobuf_benchmarks/readfile.dart';
88

9+
String? sink;
10+
911
class Benchmark extends BenchmarkBase {
1012
final f0.A0 _input;
1113

1214
Benchmark(super.name, List<int> input) : _input = f0.A0.fromBuffer(input);
1315

1416
@override
1517
void run() {
16-
_input.writeToJson();
18+
sink = _input.writeToJson();
1719
}
1820
}
1921

2022
void main() {
2123
final List<int> encoded = readfile('datasets/query_benchmark.pb');
2224
Benchmark('query_encode_json', encoded).report();
25+
26+
if (int.parse('1') == 0) {
27+
print(sink);
28+
}
2329
}

benchmarks/bin/query_set_nested_value.dart

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import 'package:protobuf_benchmarks/generated/f19.pb.dart' as f19;
99
import 'package:protobuf_benchmarks/generated/f2.pb.dart' as f2;
1010
import 'package:protobuf_benchmarks/readfile.dart';
1111

12+
GeneratedMessage? sink;
13+
1214
class Benchmark extends BenchmarkBase {
1315
final f0.A0 _input;
1416

@@ -17,8 +19,7 @@ class Benchmark extends BenchmarkBase {
1719

1820
@override
1921
void run() {
20-
// ignore: unused_result
21-
_input.rebuild((f0.A0 a0Builder) {
22+
sink = _input.rebuild((f0.A0 a0Builder) {
2223
a0Builder.a4.last = a0Builder.a4.last.rebuild((f2.A1 a1builder) {
2324
a1builder.a378 = a1builder.a378.rebuild(
2425
(f19.A220 a220builder) => a220builder.a234 = 'new_value',
@@ -31,4 +32,8 @@ class Benchmark extends BenchmarkBase {
3132
void main() {
3233
final List<int> encoded = readfile('datasets/query_benchmark.pb');
3334
Benchmark('query_set_nested_value', encoded).report();
35+
36+
if (int.parse('1') == 0) {
37+
print(sink);
38+
}
3439
}

0 commit comments

Comments
 (0)