use std::time::Instant;
pub struct TransferStats {
accumulated_chunk_len: usize, accumulated_time: u128, pub transfer_speed: u64, pub total_transferred: u64, start_time: Instant, granularity: u32, }
impl TransferStats {
pub fn start(granularity: u32) -> Self {
Self {
accumulated_chunk_len: 0,
accumulated_time: 0,
transfer_speed: 0,
total_transferred: 0,
start_time: Instant::now(),
granularity,
}
}
pub fn record_chunk_transfer(&mut self, chunk_len: usize) {
let now = Instant::now();
let it_took = now.duration_since(self.start_time).as_millis();
self.accumulated_chunk_len += chunk_len;
self.total_transferred += chunk_len as u64;
self.accumulated_time += it_took;
if self.accumulated_time >= self.granularity as u128 {
self.transfer_speed =
(self.accumulated_chunk_len as u128 / self.accumulated_time * 1024) as u64;
self.accumulated_chunk_len = 0;
self.accumulated_time = 0;
}
self.start_time = now;
}
}
impl Default for TransferStats {
fn default() -> Self {
Self::start(500) }
}