Skip to content

Commit 3b1142e

Browse files
committed
Tweak low-level benchmark.
1 parent 232d771 commit 3b1142e

File tree

1 file changed

+59
-31
lines changed

1 file changed

+59
-31
lines changed

pkgs/characters/tool/benchmark.dart

Lines changed: 59 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@ import '../test/src/unicode_grapheme_tests.dart';
1010
import '../test/src/various_tests.dart';
1111

1212
// Low-level benchmark of the grapheme cluster step functions.
13+
// Use ../benchmark/benchmark.dart for the more high-level `Characters`
14+
// methods.
1315

1416
void main(List<String> args) {
1517
var count = 5;
1618
if (args.isNotEmpty) {
1719
count = int.parse(args[0]);
1820
}
19-
var gcSumForward = 0;
20-
var gcSumBackwards = 0;
21-
22-
var text = genesis +
21+
var text =
22+
genesis +
2323
hangul +
2424
genesis +
2525
diacretics +
@@ -28,9 +28,20 @@ void main(List<String> args) {
2828
recJoin(zalgo);
2929
var codeUnits = text.length;
3030
var codePoints = text.runes.length;
31+
// Warmup.
32+
var gcSumForward = benchForward(text, -1, codePoints, codeUnits, 150);
33+
var gcSumBackwards = benchBackward(text, -1, codePoints, codeUnits, 150);
34+
if (gcSumForward != gcSumBackwards) {
35+
print(
36+
'ERROR: Did not count the same number of grapheme clusters: '
37+
'$gcSumForward forward vs. $gcSumBackwards backward.',
38+
);
39+
return;
40+
}
41+
3142
for (var i = 0; i < count; i++) {
32-
gcSumForward = benchForward(text, i, codePoints, codeUnits);
33-
gcSumBackwards = benchBackward(text, i, codePoints, codeUnits);
43+
gcSumForward = benchForward(text, i, codePoints, codeUnits, 1500);
44+
gcSumBackwards = benchBackward(text, i, codePoints, codeUnits, 1500);
3445
}
3546
print('gc: Grapheme Clusters, cp: Code Points, cu: Code Units.');
3647
if (gcSumForward != gcSumBackwards) {
@@ -39,7 +50,12 @@ void main(List<String> args) {
3950
'$gcSumForward forward vs. $gcSumBackwards backward.',
4051
);
4152
} else {
42-
print('Total: $gcSumForward gc, $codePoints cp, $codeUnits cu');
53+
var surrogates = codeUnits - codePoints;
54+
print(
55+
'Total: $gcSumForward gc, $codePoints cp, $codeUnits cu, '
56+
'$surrogates surrogates '
57+
'(${(surrogates / codePoints * 100).toStringAsFixed(3)}%)',
58+
);
4359
print('Avg ${(codePoints / gcSumForward).toStringAsFixed(3)} cp/gc');
4460
print('Avg ${(codeUnits / gcSumForward).toStringAsFixed(3)} cu/gc');
4561
}
@@ -48,46 +64,58 @@ void main(List<String> args) {
4864
String recJoin(Iterable<List<String>> texts) =>
4965
texts.map((x) => x.join('')).join('\n');
5066

51-
int benchForward(String text, int i, int cp, int cu) {
67+
int benchForward(String text, int round, int cp, int cu, int limit) {
5268
var n = 0;
69+
var step = 10;
5370
var gc = 0;
5471
var e = 0;
5572
var sw = Stopwatch()..start();
5673
do {
57-
var breaks = Breaks(text, 0, text.length, stateSoTNoBreak);
58-
while (breaks.nextBreak() >= 0) {
59-
gc++;
74+
for (var i = 0; i < step; i++) {
75+
var breaks = Breaks(text, 0, text.length, stateSoTNoBreak);
76+
while (breaks.nextBreak() >= 0) {
77+
gc++;
78+
}
6079
}
6180
e = sw.elapsedMilliseconds;
62-
n++;
63-
} while (e < 2000);
64-
print(
65-
'Forward #$i: ${(gc / e).round()} gc/ms, '
66-
'${(n * cp / e).round()} cp/ms, '
67-
'${(n * cu / e).round()} cu/ms, '
68-
'$n rounds',
69-
);
81+
n += step;
82+
step += step;
83+
} while (e < limit);
84+
if (limit > 500) {
85+
print(
86+
'Forward #$round: ${(gc / e).round()} gc/ms, '
87+
'${(n * cp / e).round()} cp/ms, '
88+
'${(n * cu / e).round()} cu/ms, '
89+
'$n rounds in $e ms',
90+
);
91+
}
7092
return gc ~/ n;
7193
}
7294

73-
int benchBackward(String text, int i, int cp, int cu) {
95+
int benchBackward(String text, int round, int cp, int cu, int limit) {
7496
var n = 0;
97+
var step = 10;
7598
var gc = 0;
7699
var e = 0;
77100
var sw = Stopwatch()..start();
78101
do {
79-
var breaks = BackBreaks(text, text.length, 0, stateEoTNoBreak);
80-
while (breaks.nextBreak() >= 0) {
81-
gc++;
102+
for (var i = 0; i < step; i++) {
103+
var breaks = BackBreaks(text, text.length, 0, stateEoTNoBreak);
104+
while (breaks.nextBreak() >= 0) {
105+
gc++;
106+
}
82107
}
83108
e = sw.elapsedMilliseconds;
84-
n++;
85-
} while (e < 2000);
86-
print(
87-
'Backward #$i: ${(gc / e).round()} gc/ms, '
88-
'${(n * cp / e).round()} cp/ms, '
89-
'${(n * cu / e).round()} cu/ms, '
90-
'$n rounds',
91-
);
109+
n += step;
110+
step += step;
111+
} while (e < limit);
112+
if (limit > 500) {
113+
print(
114+
'Backward #$round: ${(gc / e).round()} gc/ms, '
115+
'${(n * cp / e).round()} cp/ms, '
116+
'${(n * cu / e).round()} cu/ms, '
117+
'$n rounds in $e ms',
118+
);
119+
}
92120
return gc ~/ n;
93121
}

0 commit comments

Comments
 (0)