@@ -106,15 +106,7 @@ extension BenchmarkRunner {
106106 === Comparison chart =================================================================
107107 Press Control-C to close...
108108 """ )
109- BenchmarkResultApp . comparisons = {
110- return comparisons. sorted {
111- let delta0 = Float ( $0. latest. median. seconds - $0. baseline. median. seconds)
112- / Float( $0. baseline. median. seconds)
113- let delta1 = Float ( $1. latest. median. seconds - $1. baseline. median. seconds)
114- / Float( $1. baseline. median. seconds)
115- return delta0 > delta1
116- }
117- } ( )
109+ BenchmarkResultApp . comparisons = comparisons
118110 BenchmarkResultApp . main ( )
119111 }
120112 #endif
@@ -141,11 +133,43 @@ extension BenchmarkRunner {
141133 }
142134}
143135
144- struct BenchmarkResult : Codable {
145- let compileTime : Time
136+ struct Measurement : Codable , CustomStringConvertible {
146137 let median : Time
147138 let stdev : Double
148139 let samples : Int
140+
141+ init ( results: [ Time ] ) {
142+ let sorted = results. sorted ( )
143+ self . samples = sorted. count
144+ self . median = sorted [ samples/ 2 ]
145+ let sum = results. reduce ( 0.0 ) { acc, next in acc + next. seconds}
146+ let mean = sum / Double( samples)
147+ let squareDiffs = results. reduce ( 0.0 ) { acc, next in
148+ acc + pow( next. seconds - mean, 2 )
149+ }
150+ self . stdev = ( squareDiffs / Double( samples) ) . squareRoot ( )
151+ }
152+
153+ var description : String {
154+ return " \( median) (stdev: \( Time ( stdev) ) , N = \( samples) ) "
155+ }
156+ }
157+
158+ struct BenchmarkResult : Codable , CustomStringConvertible {
159+ let runtime : Measurement
160+ let compileTime : Measurement ?
161+ let parseTime : Measurement ?
162+
163+ var description : String {
164+ var base = " > run time: \( runtime. description) "
165+ if let compileTime = compileTime {
166+ base += " \n > compile time: \( compileTime) "
167+ }
168+ if let parseTime = parseTime {
169+ base += " \n > parse time: \( parseTime) "
170+ }
171+ return base
172+ }
149173}
150174
151175extension BenchmarkResult {
@@ -160,56 +184,57 @@ extension BenchmarkResult {
160184 case runtime
161185 case compileTime
162186 }
187+
188+ var latestTime : Time {
189+ switch type {
190+ case . compileTime:
191+ return latest. compileTime? . median ?? . zero
192+ case . runtime:
193+ return latest. runtime. median
194+ }
195+ }
196+
197+ var baselineTime : Time {
198+ switch type {
199+ case . compileTime:
200+ return baseline. compileTime? . median ?? . zero
201+ case . runtime:
202+ return baseline. runtime. median
203+ }
204+ }
163205
164206 var diff : Time ? {
165207 switch type {
166208 case . compileTime:
167- return latest . compileTime - baseline . compileTime
209+ return latestTime - baselineTime
168210 case . runtime:
169- if Stats . tTest ( baseline, latest) {
170- return latest . median - baseline . median
211+ if Stats . tTest ( baseline. runtime , latest. runtime ) {
212+ return latestTime - baselineTime
171213 }
172214 return nil
173215 }
174-
216+ }
217+
218+ var normalizedDiff : Double {
219+ latestTime. seconds/ baselineTime. seconds
175220 }
176221
177222 var description : String {
178223 guard let diff = diff else {
179224 return " - \( name) N/A "
180225 }
181- let oldVal : Time
182- let newVal : Time
183- switch type {
184- case . compileTime:
185- oldVal = baseline. compileTime
186- newVal = latest. compileTime
187- case . runtime:
188- oldVal = baseline. median
189- newVal = latest. median
190- }
191- let percentage = ( 1000 * diff. seconds / oldVal. seconds) . rounded ( ) / 10
226+ let percentage = ( 1000 * diff. seconds / baselineTime. seconds) . rounded ( ) / 10
192227 let len = max ( 40 - name. count, 1 )
193228 let nameSpacing = String ( repeating: " " , count: len)
194- return " - \( name) \( nameSpacing) \( newVal ) \t \( oldVal ) \t \( diff) \t \t \( percentage) % "
229+ return " - \( name) \( nameSpacing) \( latestTime ) \t \( baselineTime ) \t \( diff) \t \t \( percentage) % "
195230 }
196231
197232 var asCsv : String {
198233 guard let diff = diff else {
199234 return " \( name) ,N/A "
200235 }
201- let oldVal : Time
202- let newVal : Time
203- switch type {
204- case . compileTime:
205- oldVal = baseline. compileTime
206- newVal = latest. compileTime
207- case . runtime:
208- oldVal = baseline. median
209- newVal = latest. median
210- }
211- let percentage = ( 1000 * diff. seconds / oldVal. seconds) . rounded ( ) / 10
212- return " \" \( name) \" , \( newVal. seconds) , \( oldVal. seconds) , \( diff. seconds) , \( percentage) % "
236+ let percentage = ( 1000 * diff. seconds / baselineTime. seconds) . rounded ( ) / 10
237+ return " \" \( name) \" , \( latestTime. seconds) , \( baselineTime. seconds) , \( diff. seconds) , \( percentage) % "
213238 }
214239 }
215240}
0 commit comments