stream/
lib.rs

1mod kernel;
2
3use std::{fmt, time::{Duration, Instant}};
4
5use size::{Base, Size};
6
7pub use crate::kernel::*;
8
9struct Timings {
10    min: Duration,
11    max: Duration,
12    total: Duration,
13}
14
15impl Default for Timings {
16    fn default() -> Self {
17        Self {
18            min: Duration::MAX,
19            max: Duration::ZERO,
20            total: Duration::ZERO,
21        }
22    }
23}
24
25impl Timings {
26    fn push(&mut self, d: Duration) {
27        self.min = Duration::min(self.min, d);
28        self.max = Duration::max(self.max, d);
29        self.total += d;
30    }
31}
32
33pub struct Rate {
34    min: Duration,
35    max: Duration,
36    avg: Duration,
37    size: Size
38}
39
40impl fmt::Display for Rate {
41    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
42        write!(f, "{1:.0$}/s | time min {2:.0$?} avg {3:.0$?} max {4:.0$?}",
43            f.precision().unwrap_or(1),
44            (self.size / self.min.as_secs_f64()).format().with_base(Base::Base10),
45            self.min, self.avg, self.max)
46    }
47}
48
49pub fn bench(mut kernel: Box<dyn Kernel>, runs: usize) -> Rate {
50    let mut timings = Timings::default();
51
52    kernel.init();
53    kernel.run();
54
55    for _ in 1..runs {
56        let start = Instant::now();
57        kernel.run();
58        let elapsed = start.elapsed();
59        timings.push(elapsed);
60    }
61
62    Rate {
63        min: timings.min,
64        max: timings.max,
65        avg: timings.total / (runs - 1) as u32,
66        size: kernel.size(),
67    }
68}