| 1 | //! Benchmark metrics. |
| 2 | |
| 3 | use std::collections::BTreeMap; |
| 4 | |
| 5 | #[derive (Clone, PartialEq, Debug, Copy)] |
| 6 | pub struct Metric { |
| 7 | value: f64, |
| 8 | noise: f64, |
| 9 | } |
| 10 | |
| 11 | impl Metric { |
| 12 | pub fn new(value: f64, noise: f64) -> Metric { |
| 13 | Metric { value, noise } |
| 14 | } |
| 15 | } |
| 16 | |
| 17 | #[derive (Clone, PartialEq)] |
| 18 | pub struct MetricMap(BTreeMap<String, Metric>); |
| 19 | |
| 20 | impl MetricMap { |
| 21 | pub fn new() -> MetricMap { |
| 22 | MetricMap(BTreeMap::new()) |
| 23 | } |
| 24 | |
| 25 | /// Insert a named `value` (+/- `noise`) metric into the map. The value |
| 26 | /// must be non-negative. The `noise` indicates the uncertainty of the |
| 27 | /// metric, which doubles as the "noise range" of acceptable |
| 28 | /// pairwise-regressions on this named value, when comparing from one |
| 29 | /// metric to the next using `compare_to_old`. |
| 30 | /// |
| 31 | /// If `noise` is positive, then it means this metric is of a value |
| 32 | /// you want to see grow smaller, so a change larger than `noise` in the |
| 33 | /// positive direction represents a regression. |
| 34 | /// |
| 35 | /// If `noise` is negative, then it means this metric is of a value |
| 36 | /// you want to see grow larger, so a change larger than `noise` in the |
| 37 | /// negative direction represents a regression. |
| 38 | pub fn insert_metric(&mut self, name: &str, value: f64, noise: f64) { |
| 39 | let m = Metric { value, noise }; |
| 40 | self.0.insert(name.to_owned(), m); |
| 41 | } |
| 42 | |
| 43 | pub fn fmt_metrics(&self) -> String { |
| 44 | let v = self |
| 45 | .0 |
| 46 | .iter() |
| 47 | .map(|(k, v)| format!(" {}: {} (+/- {})" , *k, v.value, v.noise)) |
| 48 | .collect::<Vec<_>>(); |
| 49 | v.join(", " ) |
| 50 | } |
| 51 | } |
| 52 | |