in Sources/CollectionsBenchmark/BenchmarkCLI/BenchmarkCLI+Results+Compare.swift [266:298]
init?(before: TaskResults, after: TaskResults) {
var improvementFactors: [Double] = []
var regressionFactors: [Double] = []
for (size, before) in before {
let after = after[size]
guard let amin = before.minimum, let bmin = after.minimum else { continue }
guard amin.seconds > 0, bmin.seconds > 0 else { continue }
if amin < bmin {
regressionFactors.append(amin.seconds / bmin.seconds)
} else {
improvementFactors.append(amin.seconds / bmin.seconds)
}
}
guard !improvementFactors.isEmpty || !regressionFactors.isEmpty else { return nil }
overallCount = improvementFactors.count + regressionFactors.count
improvementCount = improvementFactors.count
regressionCount = regressionFactors.count
overall = regressionFactors.sorted().reduce(into: 0, { $0 += $1 })
overall += improvementFactors.sorted().reduce(into: 0, { $0 += $1 })
overall /= Double(overallCount)
#if false // average of absolutes
score =
(improvementFactors + regressionFactors.map { 1 / $0 })
._scaledAverage(count: overallCount)
#else
score = overall < 1 ? 1 / overall : overall
#endif
improvements = improvementFactors._scaledAverage(count: overallCount)
regressions = regressionFactors._scaledAverage(count: overallCount)
}