@@ -10,15 +10,14 @@ import '../test/src/unicode_grapheme_tests.dart';
10
10
import '../test/src/various_tests.dart' ;
11
11
12
12
// Low-level benchmark of the grapheme cluster step functions.
13
+ // Use ../benchmark/benchmark.dart for the more high-level `Characters`
14
+ // methods.
13
15
14
16
void main (List <String > args) {
15
17
var count = 5 ;
16
18
if (args.isNotEmpty) {
17
19
count = int .parse (args[0 ]);
18
20
}
19
- var gcsf = 0 ;
20
- var gcsb = 0 ;
21
-
22
21
var text = genesis +
23
22
hangul +
24
23
genesis +
@@ -28,66 +27,94 @@ void main(List<String> args) {
28
27
recJoin (zalgo);
29
28
var codeUnits = text.length;
30
29
var codePoints = text.runes.length;
30
+ // Warmup.
31
+ var gcSumForward = benchForward (text, - 1 , codePoints, codeUnits, 150 );
32
+ var gcSumBackwards = benchBackward (text, - 1 , codePoints, codeUnits, 150 );
33
+ if (gcSumForward != gcSumBackwards) {
34
+ print (
35
+ 'ERROR: Did not count the same number of grapheme clusters: '
36
+ '$gcSumForward forward vs. $gcSumBackwards backward.' ,
37
+ );
38
+ return ;
39
+ }
40
+
31
41
for (var i = 0 ; i < count; i++ ) {
32
- gcsf = benchForward (text, i, codePoints, codeUnits);
33
- gcsb = benchBackward (text, i, codePoints, codeUnits);
42
+ gcSumForward = benchForward (text, i, codePoints, codeUnits, 1500 );
43
+ gcSumBackwards = benchBackward (text, i, codePoints, codeUnits, 1500 );
34
44
}
35
45
print ('gc: Grapheme Clusters, cp: Code Points, cu: Code Units.' );
36
- if (gcsf != gcsb ) {
46
+ if (gcSumForward != gcSumBackwards ) {
37
47
print (
38
48
'ERROR: Did not count the same number of grapheme clusters: '
39
- '$gcsf forward vs. $gcsb backward.' ,
49
+ '$gcSumForward forward vs. $gcSumBackwards backward.' ,
40
50
);
41
51
} else {
42
- print ('Total: $gcsf gc, $codePoints cp, $codeUnits cu' );
43
- print ('Avg ${(codePoints / gcsf ).toStringAsFixed (3 )} cp/gc' );
44
- print ('Avg ${(codeUnits / gcsf ).toStringAsFixed (3 )} cu/gc' );
52
+ var surrogates = codeUnits - codePoints;
53
+ print (
54
+ 'Total: $gcSumForward gc, $codePoints cp, $codeUnits cu, '
55
+ '$surrogates surrogates '
56
+ '(${(surrogates / codePoints * 100 ).toStringAsFixed (3 )}%)' ,
57
+ );
58
+ print ('Avg ${(codePoints / gcSumForward ).toStringAsFixed (3 )} cp/gc' );
59
+ print ('Avg ${(codeUnits / gcSumForward ).toStringAsFixed (3 )} cu/gc' );
45
60
}
46
61
}
47
62
48
63
String recJoin (Iterable <List <String >> texts) =>
49
64
texts.map ((x) => x.join ('' )).join ('\n ' );
50
65
51
- int benchForward (String text, int i , int cp, int cu) {
66
+ int benchForward (String text, int round , int cp, int cu, int limit ) {
52
67
var n = 0 ;
68
+ var step = 10 ;
53
69
var gc = 0 ;
54
70
var e = 0 ;
55
71
var sw = Stopwatch ()..start ();
56
72
do {
57
- var breaks = Breaks (text, 0 , text.length, stateSoTNoBreak);
58
- while (breaks.nextBreak () >= 0 ) {
59
- gc++ ;
73
+ for (var i = 0 ; i < step; i++ ) {
74
+ var breaks = Breaks (text, 0 , text.length, stateSoTNoBreak);
75
+ while (breaks.nextBreak () >= 0 ) {
76
+ gc++ ;
77
+ }
60
78
}
61
79
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
- );
80
+ n += step;
81
+ step += step;
82
+ } while (e < limit);
83
+ if (limit > 500 ) {
84
+ print (
85
+ 'Forward #$round : ${(gc / e ).round ()} gc/ms, '
86
+ '${(n * cp / e ).round ()} cp/ms, '
87
+ '${(n * cu / e ).round ()} cu/ms, '
88
+ '$n rounds in $e ms' ,
89
+ );
90
+ }
70
91
return gc ~ / n;
71
92
}
72
93
73
- int benchBackward (String text, int i , int cp, int cu) {
94
+ int benchBackward (String text, int round , int cp, int cu, int limit ) {
74
95
var n = 0 ;
96
+ var step = 10 ;
75
97
var gc = 0 ;
76
98
var e = 0 ;
77
99
var sw = Stopwatch ()..start ();
78
100
do {
79
- var breaks = BackBreaks (text, text.length, 0 , stateEoTNoBreak);
80
- while (breaks.nextBreak () >= 0 ) {
81
- gc++ ;
101
+ for (var i = 0 ; i < step; i++ ) {
102
+ var breaks = BackBreaks (text, text.length, 0 , stateEoTNoBreak);
103
+ while (breaks.nextBreak () >= 0 ) {
104
+ gc++ ;
105
+ }
82
106
}
83
107
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
- );
108
+ n += step;
109
+ step += step;
110
+ } while (e < limit);
111
+ if (limit > 500 ) {
112
+ print (
113
+ 'Backward #$round : ${(gc / e ).round ()} gc/ms, '
114
+ '${(n * cp / e ).round ()} cp/ms, '
115
+ '${(n * cu / e ).round ()} cu/ms, '
116
+ '$n rounds in $e ms' ,
117
+ );
118
+ }
92
119
return gc ~ / n;
93
120
}
0 commit comments