benchmark_rs/
analysis_result.rs

1use crate::benchmark_comparison::BenchmarkComparison;
2use serde::{Deserialize, Serialize};
3use std::{
4    collections::{HashMap, HashSet},
5    fmt::Display,
6};
7
8/// Result of the comparison of two benchmarks
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct AnalysisResult {
11    name: String,
12    new_series: HashSet<String>,
13    equal_series: HashMap<String, HashMap<String, BenchmarkComparison>>,
14    divergent_series: HashMap<String, HashMap<String, BenchmarkComparison>>,
15}
16
17impl AnalysisResult {
18    pub(crate) fn new(name: String) -> AnalysisResult {
19        AnalysisResult {
20            name,
21            new_series: Default::default(),
22            equal_series: Default::default(),
23            divergent_series: Default::default(),
24        }
25    }
26
27    pub(crate) fn add_new(&mut self, name: String) {
28        self.new_series.insert(name);
29    }
30
31    pub(crate) fn add(&mut self, name: String, comparisons: HashMap<String, BenchmarkComparison>) {
32        let equal = comparisons
33            .iter()
34            .fold(
35                true,
36                |equal, (_, benchmark_comparison)| match benchmark_comparison {
37                    BenchmarkComparison::Less { .. } => false,
38                    BenchmarkComparison::Equal { .. } => equal,
39                    BenchmarkComparison::Greater { .. } => false,
40                },
41            );
42        if equal {
43            self.equal_series.insert(name, comparisons);
44        } else {
45            self.divergent_series.insert(name, comparisons);
46        }
47    }
48
49    /// Name of the [crate::benchmarks::Benchmarks] suite that was analyzed
50    pub fn name(&self) -> &String {
51        &self.name
52    }
53
54    /// Names of series that are new in the current run
55    pub fn new_series(&self) -> &HashSet<String> {
56        &self.new_series
57    }
58
59    /// Series that are equal within provided threshold
60    pub fn equal_series(&self) -> &HashMap<String, HashMap<String, BenchmarkComparison>> {
61        &self.equal_series
62    }
63
64    /// Series that are divergent within provided threshold
65    pub fn divergent_series(&self) -> &HashMap<String, HashMap<String, BenchmarkComparison>> {
66        &self.divergent_series
67    }
68
69    /// Series that are divergent within provided threshold
70    pub fn results(&self) -> &HashMap<String, HashMap<String, BenchmarkComparison>> {
71        self.divergent_series()
72    }
73}
74
75impl Display for AnalysisResult {
76    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
77        write!(f, "{}", serde_json::to_string_pretty(&self).unwrap())
78    }
79}