@@ -12,23 +12,22 @@ const equalityThreshold = 1;
12
12
const colors = { Red : 31 , Green : 32 , Yellow : 33 , White : 37 , BrightWhite : 90 , BrightCyan : 36 } ;
13
13
14
14
const comparisonReport = ( capturesDev , capturesBuild , devSize , buildSize , buildVersion , save , benchmark ) => {
15
- const performanceDev = capturePerformanceTotals ( capturesDev ) ;
16
- const performanceBuild = capturePerformanceTotals ( capturesBuild ) ;
15
+ const {
16
+ durationChange,
17
+ memoryChange,
18
+ overlapChange
19
+ } = captureBenchmark ( capturesDev , capturesBuild ) ;
17
20
18
- const perfChange = noiseThreshold ( 1 - ( performanceDev . duration / performanceBuild . duration ) , 0.01 ) ;
19
- const memoryChange = noiseThreshold ( ( performanceDev . memory / performanceBuild . memory ) - 1 , 0.01 ) ;
20
- const overlapChange = ( performanceDev . overlap / ( performanceBuild . overlap || 1 ) ) - 1 ;
21
21
const filesizeChange = ( devSize / buildSize ) - 1 ;
22
22
23
- const similaritys = extrinsicSimilarity ( capturesDev , capturesBuild ) ;
24
- const similarityAverage = extrinsicSimilarityAverage ( similaritys ) ;
25
- const similarityEntries = Object . entries ( similaritys ) ;
26
- similarityEntries . sort ( ( a , b ) => a [ 1 ] - b [ 1 ] ) ;
27
-
28
23
const firstCapture = Object . entries ( capturesDev ) [ 0 ] [ 1 ] ;
29
24
const updates = firstCapture . extrinsic . updates ;
30
25
26
+ const similaritys = extrinsicSimilarity ( capturesDev , capturesBuild ) ;
27
+ const similarityAverage = extrinsicSimilarityAverage ( similaritys ) ;
31
28
const similarityAveragePerUpdate = Math . pow ( 1 , - 1 / updates ) * Math . pow ( similarityAverage , 1 / updates ) ;
29
+ const similarityEntries = Object . entries ( similaritys ) ;
30
+ similarityEntries . sort ( ( a , b ) => a [ 1 ] - b [ 1 ] ) ;
32
31
33
32
const devIntrinsicsChanged = { } ;
34
33
const buildIntrinsicsChanged = { } ;
@@ -51,8 +50,6 @@ const comparisonReport = (capturesDev, capturesBuild, devSize, buildSize, buildV
51
50
} )
52
51
. sort ( ( a , b ) => a . name . localeCompare ( b . name ) ) ;
53
52
54
- const formatColor = green => green ? colors . Green : colors . Yellow ;
55
-
56
53
const report = ( breakEvery , format ) => [
57
54
[ `Output sample comparison estimates of ${ similarityEntries . length } examples` ,
58
55
`against previous release ${ format ( 'matter-js@' + buildVersion , colors . Yellow ) } :`
@@ -70,7 +67,7 @@ const comparisonReport = (capturesDev, capturesBuild, devSize, buildSize, buildV
70
67
71
68
...( benchmark ? [
72
69
`\n${ format ( 'Performance' , colors . White ) } ` ,
73
- ` ${ format ( formatPercent ( perfChange ) , formatColor ( perfChange >= 0 ) ) } %` ,
70
+ ` ${ format ( formatPercent ( durationChange ) , formatColor ( durationChange >= 0 ) ) } %` ,
74
71
75
72
` ${ format ( 'Memory' , colors . White ) } ` ,
76
73
` ${ format ( formatPercent ( memoryChange ) , formatColor ( memoryChange <= 0 ) ) } %` ,
@@ -102,9 +99,13 @@ const comparisonReport = (capturesDev, capturesBuild, devSize, buildSize, buildV
102
99
} ;
103
100
104
101
const similarityRatings = similarity => similarity < equalityThreshold ? color ( '●' , colors . Yellow ) : '·' ;
102
+
105
103
const changeRatings = isChanged => isChanged ? color ( '◆' , colors . White ) : '·' ;
104
+
106
105
const color = ( text , number ) => number ? `\x1b[${ number } m${ text } \x1b[0m` : text ;
107
106
107
+ const formatColor = isGreen => isGreen ? colors . Green : colors . Yellow ;
108
+
108
109
const formatPercent = ( val , showSign = true , showFractional = false , padStart = 6 ) => {
109
110
let fractionalSign = '' ;
110
111
@@ -127,10 +128,35 @@ const noiseThreshold = (val, threshold) => {
127
128
return sign * Math . max ( 0 , magnitude - threshold ) / ( 1 - threshold ) ;
128
129
} ;
129
130
131
+ const median = ( values , lower , upper ) => {
132
+ const valuesSorted = values . slice ( 0 ) . sort ( ) ;
133
+
134
+ return mean ( valuesSorted . slice (
135
+ Math . floor ( valuesSorted . length * lower ) ,
136
+ Math . floor ( valuesSorted . length * upper )
137
+ ) ) ;
138
+ } ;
139
+
140
+ const mean = ( values ) => {
141
+ const valuesLength = values . length ;
142
+ let result = 0 ;
143
+
144
+ for ( let i = 0 ; i < valuesLength ; i += 1 ) {
145
+ result += values [ i ] ;
146
+ }
147
+
148
+ return ( result / valuesLength ) || 0 ;
149
+ } ;
150
+
130
151
const smoothExp = ( last , current ) => {
131
152
const delta = current - last ;
132
153
const sign = delta < 0 ? - 1 : 1 ;
133
154
const magnitude = Math . abs ( delta ) ;
155
+
156
+ if ( magnitude < 1 ) {
157
+ return last + 0.01 * delta ;
158
+ }
159
+
134
160
return last + Math . sqrt ( magnitude ) * sign ;
135
161
} ;
136
162
@@ -143,20 +169,35 @@ const equals = (a, b) => {
143
169
return true ;
144
170
} ;
145
171
146
- const capturePerformanceTotals = ( captures ) => {
147
- const totals = {
148
- duration : 0 ,
149
- overlap : 0 ,
150
- memory : 0
151
- } ;
172
+ const captureBenchmark = ( capturesDev , capturesBuild ) => {
173
+ const overlapChanges = [ ] ;
174
+
175
+ let durationDev = 0 ;
176
+ let durationBuild = 0 ;
177
+ let memoryDev = 0 ;
178
+ let memoryBuild = 0 ;
179
+
180
+ for ( const name in capturesDev ) {
181
+ durationDev += capturesDev [ name ] . duration ;
182
+ durationBuild += capturesBuild [ name ] . duration ;
183
+
184
+ memoryDev += capturesDev [ name ] . memory ;
185
+ memoryBuild += capturesBuild [ name ] . memory ;
152
186
153
- for ( const [ name ] of Object . entries ( captures ) ) {
154
- totals . duration += captures [ name ] . duration ;
155
- totals . overlap += captures [ name ] . overlap ;
156
- totals . memory += captures [ name ] . memory ;
187
+ if ( capturesBuild [ name ] . overlap > 0.1 && capturesDev [ name ] . overlap > 0.1 ) {
188
+ overlapChanges . push ( capturesDev [ name ] . overlap / capturesBuild [ name ] . overlap ) ;
189
+ }
157
190
} ;
158
191
159
- return totals ;
192
+ const durationChange = 1 - noiseThreshold ( durationDev / durationBuild , 0.02 ) ;
193
+ const memoryChange = noiseThreshold ( memoryDev / memoryBuild , 0.02 ) - 1 ;
194
+ const overlapChange = noiseThreshold ( median ( overlapChanges , 0.45 , 0.55 ) , 0.001 ) - 1 ;
195
+
196
+ return {
197
+ durationChange,
198
+ memoryChange,
199
+ overlapChange
200
+ } ;
160
201
} ;
161
202
162
203
const extrinsicSimilarity = ( currentCaptures , referenceCaptures , key = 'extrinsic' ) => {
0 commit comments