eutils_rs/
delay_distribution.rs

1pub struct DelayDistribution {
2    number: usize,
3    dis: Vec<usize>,
4}
5
6impl DelayDistribution {
7    pub fn new() -> DelayDistribution {
8        DelayDistribution {
9            number: 0,
10            dis: Vec::default(),
11        }
12    }
13
14    /// Delay should be measured in milliseconds, because millisecond jitter
15    /// is probably what users care about most. But the delay you enter is
16    /// fine in microseconds or nanoseconds.
17    pub fn insert(&mut self, delay: usize) {
18        if delay > 1_000_000 {
19            panic!("delay out of range, max support 1_000_000")
20        }
21
22        if delay >= self.dis.len() {
23            self.dis.resize(delay + 1, 0);
24        }
25
26        self.dis[delay] += 1;
27        self.number += 1;
28    }
29
30    pub fn show(&self, kinds: usize) {
31        // Rounded up
32        let width = (self.dis.len() + kinds - 1) / kinds;
33
34        for i in 0..kinds {
35            let start = i * width;
36            let end = std::cmp::min(start + width, self.dis.len());
37
38            let mut sum = 0;
39            for j in start..end {
40                sum += self.dis[j];
41            }
42
43            print!("{:<6}: ", end);
44            for _ in 0..(sum * 100 / self.number) {
45                print!("*");
46            }
47
48            println!();
49        }
50    }
51}