Skip to content

Commit b6a7be8

Browse files
committed
fix: stdev calculation for less than 2 runs
1 parent 5caa771 commit b6a7be8

File tree

1 file changed

+33
-1
lines changed

1 file changed

+33
-1
lines changed

crates/cargo-codspeed/src/walltime_results.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,14 @@ impl From<RawWallTimeData> for WalltimeBenchmark {
5959
let total_time = times_ns.iter().sum::<f64>() / 1_000_000_000.0;
6060

6161
let mean_ns = data.mean().unwrap();
62-
let stdev_ns = data.std_dev().unwrap();
62+
63+
let stdev_ns = if data.len() < 2 {
64+
// std_dev() returns f64::NAN if data has less than two entries, so we have to
65+
// manually handle this case.
66+
0.0
67+
} else {
68+
data.std_dev().unwrap()
69+
};
6370

6471
let q1_ns = data.quantile(0.25);
6572
let median_ns = data.median();
@@ -152,3 +159,28 @@ impl WalltimeResults {
152159
}
153160
}
154161
}
162+
163+
#[cfg(test)]
164+
mod tests {
165+
use super::*;
166+
167+
#[test]
168+
fn test_parse_single_benchmark() {
169+
let metadata = BenchmarkMetadata {
170+
name: "benchmark".to_string(),
171+
uri: "test::benchmark".to_string(),
172+
};
173+
let raw_bench = RawWallTimeData {
174+
metadata,
175+
iter_per_round: 1,
176+
max_time_ns: None,
177+
times_ns: vec![42],
178+
};
179+
180+
let benchmark: WalltimeBenchmark = raw_bench.into();
181+
assert_eq!(benchmark.stats.stdev_ns, 0.);
182+
assert_eq!(benchmark.stats.min_ns, 42.);
183+
assert_eq!(benchmark.stats.max_ns, 42.);
184+
assert_eq!(benchmark.stats.mean_ns, 42.);
185+
}
186+
}

0 commit comments

Comments
 (0)