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}