@@ -10,15 +10,14 @@ 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 gcsf = 0 ;
20- var gcsb = 0 ;
21-
2221 var text = genesis +
2322 hangul +
2423 genesis +
@@ -28,66 +27,94 @@ void main(List<String> args) {
2827 recJoin (zalgo);
2928 var codeUnits = text.length;
3029 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+
3141 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 );
3444 }
3545 print ('gc: Grapheme Clusters, cp: Code Points, cu: Code Units.' );
36- if (gcsf != gcsb ) {
46+ if (gcSumForward != gcSumBackwards ) {
3747 print (
3848 'ERROR: Did not count the same number of grapheme clusters: '
39- '$gcsf forward vs. $gcsb backward.' ,
49+ '$gcSumForward forward vs. $gcSumBackwards backward.' ,
4050 );
4151 } 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' );
4560 }
4661}
4762
4863String recJoin (Iterable <List <String >> texts) =>
4964 texts.map ((x) => x.join ('' )).join ('\n ' );
5065
51- int benchForward (String text, int i , int cp, int cu) {
66+ int benchForward (String text, int round , int cp, int cu, int limit ) {
5267 var n = 0 ;
68+ var step = 10 ;
5369 var gc = 0 ;
5470 var e = 0 ;
5571 var sw = Stopwatch ()..start ();
5672 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+ }
6078 }
6179 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+ }
7091 return gc ~ / n;
7192}
7293
73- int benchBackward (String text, int i , int cp, int cu) {
94+ int benchBackward (String text, int round , int cp, int cu, int limit ) {
7495 var n = 0 ;
96+ var step = 10 ;
7597 var gc = 0 ;
7698 var e = 0 ;
7799 var sw = Stopwatch ()..start ();
78100 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+ }
82106 }
83107 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+ }
92119 return gc ~ / n;
93120}
0 commit comments