diff --git a/site/src/comparison.rs b/site/src/comparison.rs
index ff6bf82b4..34661ec05 100644
--- a/site/src/comparison.rs
+++ b/site/src/comparison.rs
@@ -7,6 +7,7 @@ use crate::db::{ArtifactId, Benchmark, Lookup, Profile, Scenario};
use crate::github;
use crate::load::SiteCtxt;
use crate::selector::{self, Tag};
+use std::cmp::Ordering;
use collector::Bound;
use serde::Serialize;
@@ -501,14 +502,26 @@ pub fn write_summary_table(
let largest_change = if primary.is_empty() {
"N/A".to_string()
} else {
- let change = primary
- .most_relevant_changes()
- .iter()
- .fold(0.0, |accum: f64, item| {
- let change = item.map(|v| v.relative_change() * 100.0).unwrap_or(0.0);
- accum.max(change)
- });
- format!("{:.1}%", change)
+ let largest_improvement = primary
+ .largest_improvement()
+ .map(|c| c.relative_change())
+ .unwrap_or(0.0);
+ let largest_regression = primary
+ .largest_regression()
+ .map(|c| c.relative_change())
+ .unwrap_or(0.0);
+ let change = if largest_improvement
+ .abs()
+ .partial_cmp(&largest_regression.abs())
+ .unwrap_or(Ordering::Equal)
+ != Ordering::Less
+ {
+ largest_improvement
+ } else {
+ largest_regression
+ };
+
+ format!("{:.1}%", change * 100.0)
};
writeln!(
@@ -1317,7 +1330,7 @@ mod tests {
};
#[test]
- fn summary_table_only_improvements_primary() {
+ fn summary_table_only_regressions_primary() {
check_table(
vec![
(Category::Primary, 5.0, 10.0),
@@ -1339,7 +1352,7 @@ mod tests {
}
#[test]
- fn summary_table_only_regressions_primary() {
+ fn summary_table_only_improvements_primary() {
check_table(
vec![
(Category::Primary, 5.0, 2.0),
@@ -1351,7 +1364,7 @@ mod tests {
|:---:|:---:|:---:|:---:|:---:|:---:|
| count[^1] | 0 | 0 | 3 | 0 | 3 |
| mean[^2] | N/A | N/A | -71.7% | N/A | -71.7% |
-| max | N/A | N/A | -80.0% | N/A | 0.0% |
+| max | N/A | N/A | -80.0% | N/A | -80.0% |
[^1]: *number of relevant changes*
[^2]: *the arithmetic mean of the percent change*
@@ -1445,6 +1458,48 @@ mod tests {
| mean[^2] | 150.0% | 100.0% | -62.5% | -66.7% | 43.8% |
| max | 200.0% | 100.0% | -75.0% | -66.7% | 200.0% |
+[^1]: *number of relevant changes*
+[^2]: *the arithmetic mean of the percent change*
+"#
+ .trim_start(),
+ );
+ }
+
+ #[test]
+ fn summary_table_mixed_largest_change_improvement() {
+ check_table(
+ vec![
+ (Category::Primary, 10.0, 5.0),
+ (Category::Primary, 5.0, 6.0),
+ ],
+ r#"
+| | Regressions 😿
(primary) | Regressions 😿
(secondary) | Improvements 🎉
(primary) | Improvements 🎉
(secondary) | All 😿 🎉
(primary) |
+|:---:|:---:|:---:|:---:|:---:|:---:|
+| count[^1] | 1 | 0 | 1 | 0 | 2 |
+| mean[^2] | 20.0% | N/A | -50.0% | N/A | -15.0% |
+| max | 20.0% | N/A | -50.0% | N/A | -50.0% |
+
+[^1]: *number of relevant changes*
+[^2]: *the arithmetic mean of the percent change*
+"#
+ .trim_start(),
+ );
+ }
+
+ #[test]
+ fn summary_table_mixed_largest_change_regression() {
+ check_table(
+ vec![
+ (Category::Primary, 5.0, 10.0),
+ (Category::Primary, 6.0, 5.0),
+ ],
+ r#"
+| | Regressions 😿
(primary) | Regressions 😿
(secondary) | Improvements 🎉
(primary) | Improvements 🎉
(secondary) | All 😿 🎉
(primary) |
+|:---:|:---:|:---:|:---:|:---:|:---:|
+| count[^1] | 1 | 0 | 1 | 0 | 2 |
+| mean[^2] | 100.0% | N/A | -16.7% | N/A | 41.7% |
+| max | 100.0% | N/A | -16.7% | N/A | 100.0% |
+
[^1]: *number of relevant changes*
[^2]: *the arithmetic mean of the percent change*
"#