@@ -10,16 +10,16 @@ import '../test/src/unicode_grapheme_tests.dart';
1010import '../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
1416void 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) {
4864String 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