Skip to content

Commit d655c93

Browse files
davidmorganlrhn
authored andcommitted
[macros] JSON benchmarks, JsonBuffer experiment. (#3883)
1 parent 937f9bc commit d655c93

File tree

11 files changed

+662
-3
lines changed

11 files changed

+662
-3
lines changed

working/macros/dart_model/README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ as a library;\
2121
The "macros" referred to in this exploration are independent of the in-progress
2222
macro implementation, hence the "scare quotes".
2323

24-
## Benchmarks
24+
## End to End Benchmarks
2525

2626
`testing/benchmark` is a tool to assist in benchmarking, it creates codebases
2727
of the specified size and codegen strategy.
@@ -65,3 +65,7 @@ $ dart bin/main.dart
6565
# files to see how the analyzer responds; you can watch the macro host terminal
6666
# to see when it is rewriting augmentation files.
6767
```
68+
69+
## Serialization Benchmarks
70+
71+
`testing/json_benchmark` is benchmarking related to JSON serialization.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import 'package:json_benchmark/json_benchmark.dart';
2+
3+
Future<void> main() async => JsonBenchmark().run();
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import 'dart:io';
2+
3+
import 'json_buffer_subject.dart';
4+
import 'json_subject.dart';
5+
6+
class JsonBenchmark {
7+
Future<void> run() async {
8+
final jsonSubject = JsonSubject();
9+
10+
print('Subject,Scenario,Data size/bytes,Time per/ms');
11+
for (final subject in [
12+
JsonBufferSubject(),
13+
JsonBufferSubject(),
14+
JsonBufferSubject(),
15+
JsonBufferSubject(),
16+
JsonBufferSubject(), /*JsonSubject()*/
17+
]) {
18+
for (final size in [256]) {
19+
final neutralData = jsonSubject.createData(libraryCount: size);
20+
final subjectData = subject.deepCopyIn(neutralData);
21+
final byteData = subject.serialize(subjectData);
22+
final byteLength = byteData.length;
23+
24+
await benchmark(subject.name, 'create', byteLength,
25+
() => subject.createData(libraryCount: size));
26+
await benchmark(subject.name, 'deepCopyIn', byteLength,
27+
() => subject.deepCopyIn(neutralData));
28+
await benchmark(subject.name, 'serialize', byteLength,
29+
() => subject.serialize(subjectData));
30+
await benchmark(subject.name, 'writeSync', byteLength,
31+
() => File('/tmp/benchmark').writeAsBytesSync(byteData));
32+
await benchmark(
33+
subject.name,
34+
'copySerializeWrite',
35+
byteLength,
36+
() => File('/tmp/benchmark').writeAsBytesSync(
37+
subject.serialize(subject.deepCopyIn(neutralData))));
38+
await benchmark(
39+
subject.name,
40+
'createSerializeWrite',
41+
byteLength,
42+
() => File('/tmp/benchmark').writeAsBytesSync(
43+
subject.serialize(subject.createData(libraryCount: size))));
44+
45+
await benchmark(
46+
subject.name, 'process', byteLength, () => process(subjectData));
47+
await benchmark(subject.name, 'deepCopyOut', byteLength,
48+
() => subject.deepCopyOut(subjectData));
49+
await benchmark(subject.name, 'readSync', byteLength,
50+
() => File('/tmp/benchmark').readAsBytesSync());
51+
await benchmark(subject.name, 'deserialize', byteLength,
52+
() => subject.deserialize(byteData));
53+
await benchmark(
54+
subject.name,
55+
'readDeserializeCopy',
56+
byteLength,
57+
() => subject.deepCopyOut(
58+
subject.deserialize(File('/tmp/benchmark').readAsBytesSync())));
59+
await benchmark(
60+
subject.name,
61+
'readDeserializeProcess',
62+
byteLength,
63+
() => process(
64+
subject.deserialize(File('/tmp/benchmark').readAsBytesSync())));
65+
}
66+
}
67+
}
68+
69+
int process(Map<String, Object?> data) {
70+
var result = 0;
71+
for (final entry in data.entries) {
72+
final key = entry.key;
73+
result ^= key.hashCode;
74+
var value = entry.value;
75+
if (value is Map<String, Object?>) {
76+
result ^= process(value);
77+
} else {
78+
result ^= value.hashCode;
79+
}
80+
}
81+
return result;
82+
}
83+
84+
Future<void> benchmark(String subjectName, String scenarioName, int length,
85+
Function subject) async {
86+
final repetitions = 100;
87+
for (var i = 0; i != repetitions; ++i) {
88+
subject();
89+
}
90+
final stopwatch = Stopwatch()..start();
91+
for (var i = 0; i != repetitions; ++i) {
92+
subject();
93+
}
94+
final elapsed = stopwatch.elapsedMilliseconds;
95+
print('$subjectName,$scenarioName,$length,${elapsed / repetitions}');
96+
}
97+
}

0 commit comments

Comments
 (0)