tester/helpers/
metrics.rs

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