criterion/
format.rs

1pub fn change(pct: f64, signed: bool) -> String {
2    if signed {
3        format!("{:>+6}%", signed_short(pct * 1e2))
4    } else {
5        format!("{:>6}%", short(pct * 1e2))
6    }
7}
8
9pub fn time(ns: f64) -> String {
10    if ns < 1.0 {
11        format!("{:>6} ps", short(ns * 1e3))
12    } else if ns < 10f64.powi(3) {
13        format!("{:>6} ns", short(ns))
14    } else if ns < 10f64.powi(6) {
15        format!("{:>6} µs", short(ns / 1e3))
16    } else if ns < 10f64.powi(9) {
17        format!("{:>6} ms", short(ns / 1e6))
18    } else {
19        format!("{:>6} s", short(ns / 1e9))
20    }
21}
22
23pub fn short(n: f64) -> String {
24    if n < 10.0 {
25        format!("{:.4}", n)
26    } else if n < 100.0 {
27        format!("{:.3}", n)
28    } else if n < 1000.0 {
29        format!("{:.2}", n)
30    } else if n < 10000.0 {
31        format!("{:.1}", n)
32    } else {
33        format!("{:.0}", n)
34    }
35}
36
37fn signed_short(n: f64) -> String {
38    let n_abs = n.abs();
39
40    if n_abs < 10.0 {
41        format!("{:+.4}", n)
42    } else if n_abs < 100.0 {
43        format!("{:+.3}", n)
44    } else if n_abs < 1000.0 {
45        format!("{:+.2}", n)
46    } else if n_abs < 10000.0 {
47        format!("{:+.1}", n)
48    } else {
49        format!("{:+.0}", n)
50    }
51}
52
53pub fn iter_count(iterations: u64) -> String {
54    if iterations < 10_000 {
55        format!("{} iterations", iterations)
56    } else if iterations < 1_000_000 {
57        format!("{:.0}k iterations", (iterations as f64) / 1000.0)
58    } else if iterations < 10_000_000 {
59        format!("{:.1}M iterations", (iterations as f64) / (1000.0 * 1000.0))
60    } else if iterations < 1_000_000_000 {
61        format!("{:.0}M iterations", (iterations as f64) / (1000.0 * 1000.0))
62    } else if iterations < 10_000_000_000 {
63        format!(
64            "{:.1}B iterations",
65            (iterations as f64) / (1000.0 * 1000.0 * 1000.0)
66        )
67    } else {
68        format!(
69            "{:.0}B iterations",
70            (iterations as f64) / (1000.0 * 1000.0 * 1000.0)
71        )
72    }
73}
74
75pub fn integer(n: f64) -> String {
76    format!("{}", n as u64)
77}
78
79#[cfg(test)]
80mod test {
81    use super::*;
82
83    #[test]
84    fn short_max_len() {
85        let mut float = 1.0;
86        while float < 999_999.9 {
87            let string = short(float);
88            println!("{}", string);
89            assert!(string.len() <= 6);
90            float *= 2.0;
91        }
92    }
93
94    #[test]
95    fn signed_short_max_len() {
96        let mut float = -1.0;
97        while float > -999_999.9 {
98            let string = signed_short(float);
99            println!("{}", string);
100            assert!(string.len() <= 7);
101            float *= 2.0;
102        }
103    }
104}