@@ -106,15 +106,7 @@ extension BenchmarkRunner {
106
106
=== Comparison chart =================================================================
107
107
Press Control-C to close...
108
108
""" )
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
118
110
BenchmarkResultApp . main ( )
119
111
}
120
112
#endif
@@ -141,11 +133,43 @@ extension BenchmarkRunner {
141
133
}
142
134
}
143
135
144
- struct BenchmarkResult : Codable {
145
- let compileTime : Time
136
+ struct Measurement : Codable , CustomStringConvertible {
146
137
let median : Time
147
138
let stdev : Double
148
139
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
+ }
149
173
}
150
174
151
175
extension BenchmarkResult {
@@ -160,56 +184,57 @@ extension BenchmarkResult {
160
184
case runtime
161
185
case compileTime
162
186
}
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
+ }
163
205
164
206
var diff : Time ? {
165
207
switch type {
166
208
case . compileTime:
167
- return latest . compileTime - baseline . compileTime
209
+ return latestTime - baselineTime
168
210
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
171
213
}
172
214
return nil
173
215
}
174
-
216
+ }
217
+
218
+ var normalizedDiff : Double {
219
+ latestTime. seconds/ baselineTime. seconds
175
220
}
176
221
177
222
var description : String {
178
223
guard let diff = diff else {
179
224
return " - \( name) N/A "
180
225
}
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
192
227
let len = max ( 40 - name. count, 1 )
193
228
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) % "
195
230
}
196
231
197
232
var asCsv : String {
198
233
guard let diff = diff else {
199
234
return " \( name) ,N/A "
200
235
}
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) % "
213
238
}
214
239
}
215
240
}
0 commit comments