Skip to main content

Mountain/IPC/Common/PerformanceMetrics/
ThroughputMetrics.rs

1#![allow(non_snake_case)]
2
3//! Per-direction message + byte counters with a fixed start time so
4//! `MessagesPerSecond*` / `BytesPerSecond*` are derivable as
5//! divisions over the elapsed period.
6
7use std::time::Instant;
8
9#[derive(Debug, Clone)]
10pub struct Struct {
11	pub MessagesReceived:u64,
12
13	pub MessagesSent:u64,
14
15	pub BytesReceived:u64,
16
17	pub BytesSent:u64,
18
19	pub StartTime:Instant,
20}
21
22impl Struct {
23	pub fn new() -> Self {
24		Self {
25			MessagesReceived:0,
26
27			MessagesSent:0,
28
29			BytesReceived:0,
30
31			BytesSent:0,
32
33			StartTime:Instant::now(),
34		}
35	}
36
37	pub fn RecordReceived(&mut self, Bytes:u64) {
38		self.MessagesReceived += 1;
39
40		self.BytesReceived += Bytes;
41	}
42
43	pub fn RecordSent(&mut self, Bytes:u64) {
44		self.MessagesSent += 1;
45
46		self.BytesSent += Bytes;
47	}
48
49	pub fn MessagesPerSecondReceived(&self) -> f64 {
50		let Elapsed = self.StartTime.elapsed().as_secs_f64();
51
52		if Elapsed > 0.0 { self.MessagesReceived as f64 / Elapsed } else { 0.0 }
53	}
54
55	pub fn MessagesPerSecondSent(&self) -> f64 {
56		let Elapsed = self.StartTime.elapsed().as_secs_f64();
57
58		if Elapsed > 0.0 { self.MessagesSent as f64 / Elapsed } else { 0.0 }
59	}
60
61	pub fn BytesPerSecondReceived(&self) -> f64 {
62		let Elapsed = self.StartTime.elapsed().as_secs_f64();
63
64		if Elapsed > 0.0 { self.BytesReceived as f64 / Elapsed } else { 0.0 }
65	}
66
67	pub fn BytesPerSecondSent(&self) -> f64 {
68		let Elapsed = self.StartTime.elapsed().as_secs_f64();
69
70		if Elapsed > 0.0 { self.BytesSent as f64 / Elapsed } else { 0.0 }
71	}
72}
73
74impl Default for Struct {
75	fn default() -> Self { Self::new() }
76}