bench_rs/
lib.rs

1use serde::{Serialize, Deserialize};
2
3pub use bencher::Bencher;
4pub use bencher_macro::*;
5pub use track_allocator::TrackAllocator;
6
7mod timing_future;
8mod bencher;
9mod track_allocator;
10
11#[macro_export]
12macro_rules! new_allocator {
13    ($allocator:expr) => {
14        TrackAllocator {
15            allocator: $allocator,
16            counter: std::sync::atomic::AtomicUsize::new(0),
17            peak: std::sync::atomic::AtomicUsize::new(0)
18        };
19    };
20}
21
22#[derive(Debug, Serialize, Deserialize)]
23pub struct Stats {
24    pub times_average: usize,
25    pub times_min: usize,
26    pub times_max: usize,
27
28    pub mem_average: usize,
29    pub mem_min: usize,
30    pub mem_max: usize,
31}
32
33#[derive(Debug, Serialize, Deserialize)]
34pub struct Step {
35    time: u128,
36    mem: usize
37}
38
39impl From<&Vec<Step>> for Stats {
40    fn from(steps: &Vec<Step>) -> Self {
41        let count = steps.len();
42
43        let times = steps.iter().map(|step| step.time).collect::<Vec<u128>>();
44        let times_iter = times.iter();
45
46        let mem = steps.iter().map(|step| step.mem).collect::<Vec<usize>>();
47        let mem_iter = mem.iter();
48
49        Stats {
50            times_average: (times_iter.clone().sum::<u128>() / count as u128) as usize,
51            times_min: times_iter.clone().cloned().min().unwrap_or_default() as usize,
52            times_max: times_iter.clone().cloned().max().unwrap_or_default() as usize,
53            mem_average: mem_iter.clone().sum::<usize>() / count,
54            mem_min: mem_iter.clone().cloned().min().unwrap_or_default(),
55            mem_max: mem_iter.clone().cloned().max().unwrap_or_default()
56        }
57    }
58}
59// Format a number with thousands separators
60fn fmt_thousands_sep(mut n: usize, sep: char) -> String {
61    use std::fmt::Write;
62    let mut output = String::new();
63    let mut trailing = false;
64    for &pow in &[9, 6, 3, 0] {
65        let base = 10_usize.pow(pow);
66        if pow == 0 || trailing || n / base != 0 {
67            if !trailing {
68                output.write_fmt(format_args!("{}", n / base)).unwrap();
69            } else {
70                output.write_fmt(format_args!("{:03}", n / base)).unwrap();
71            }
72            if pow != 0 {
73                output.push(sep);
74            }
75            trailing = true;
76        }
77        n %= base;
78    }
79
80    output
81}