nodo_runtime/
statistics.rs

1// Copyright 2023 David Weikersdorfer
2
3use crate::{InspectorCodeletReport, InspectorReport};
4use nodo::codelet::Transition;
5
6pub fn statistics_pretty_print(report: InspectorReport) {
7    let mut vec = report.into_vec();
8    vec.sort_by_key(|(_, u)| {
9        u.statistics.transitions[Transition::Step]
10            .duration
11            .total()
12            .as_nanos()
13    });
14
15    println!("");
16    println!("+--------------------------+----------------------------------+--------+--------+----------------------+-------+----------------------+--------+---------+");
17    println!("| NAME                     | TYPE                             | STEP              Duration                       Period               | START            |");
18    println!("|                          |                                  | Skipped| Count  | (min-avg-max) [ms]   | Total | (min-avg-max) [ms]   | Count  |  D [ms] |");
19    println!("+--------------------------+----------------------------------+--------+--------+----------------------+-------+----------------------+--------+---------+");
20    for (
21        _,
22        InspectorCodeletReport {
23            name: tag,
24            typename,
25            statistics: stats,
26            ..
27        },
28    ) in vec.into_iter().rev()
29    {
30        println!(
31            "| {:024} | {:032} | {:6} | {:6} | {} {} {} |{} | {} {} {} | {:2} /{:2} | {} |",
32            cut_middle(&tag, 24),
33            cut_middle(&typename, 32),
34            stats.transitions[Transition::Step].skipped_count,
35            stats.transitions[Transition::Step].duration.count(),
36            stats.transitions[Transition::Step]
37                .duration
38                .min_ms()
39                .map(|dt| format!("{:>6.2}", dt))
40                .unwrap_or("------".to_string()),
41            stats.transitions[Transition::Step]
42                .duration
43                .average_ms()
44                .map(|dt| format!("{:>6.2}", dt))
45                .unwrap_or("------".to_string()),
46            stats.transitions[Transition::Step]
47                .duration
48                .max_ms()
49                .map(|dt| format!("{:>6.2}", dt))
50                .unwrap_or("------".to_string()),
51            format!(
52                "{:>6.2}",
53                stats.transitions[Transition::Step]
54                    .duration
55                    .total()
56                    .as_secs_f32()
57            ),
58            stats.transitions[Transition::Step]
59                .period
60                .min_ms()
61                .map(|dt| format!("{:>6.2}", dt))
62                .unwrap_or("------".to_string()),
63            stats.transitions[Transition::Step]
64                .period
65                .average_ms()
66                .map(|dt| format!("{:>6.2}", dt))
67                .unwrap_or("------".to_string()),
68            stats.transitions[Transition::Step]
69                .period
70                .max_ms()
71                .map(|dt| format!("{:>6.2}", dt))
72                .unwrap_or("------".to_string()),
73            stats.transitions[Transition::Start].skipped_count,
74            stats.transitions[Transition::Start].duration.count(),
75            stats.transitions[Transition::Start]
76                .duration
77                .average_ms()
78                .map(|dt| format!("{:>7.2}", dt))
79                .unwrap_or("-------".to_string()),
80        );
81    }
82    println!("+--------------------------+----------------------------------+--------+--------+----------------------+-------+----------------------+--------+---------+");
83}
84
85fn cut_middle(text: &String, len: usize) -> String {
86    if text.len() <= len || len <= 6 {
87        text.to_string()
88    } else {
89        text[0..2].to_string() + ".." + &text[(text.len() - (len - 4))..]
90    }
91}