Improve speed accuracy a bit (maybe)

This commit is contained in:
Daniel M 2021-04-01 01:08:32 +02:00
parent 0d4f32d22d
commit 96fa5c4112

View File

@ -13,7 +13,7 @@ use crate::dlreport::*;
struct RollingAverage { struct RollingAverage {
index: usize, index: usize,
data: Vec<f32> data: Vec<f64>
} }
impl RollingAverage { impl RollingAverage {
@ -25,16 +25,31 @@ impl RollingAverage {
} }
} }
fn value(&self) -> f32 { fn value(&self) -> f64 {
if self.data.len() == 0 { if self.data.len() == 0 {
0.0 0.0
} else { } else {
let sum: f32 = self.data.iter().sum(); let mut max = self.data[0];
sum / self.data.len() as f32
for v in self.data.iter() {
if *v > max {
max = *v;
}
}
let mut sum: f64 = self.data.iter().sum();
let mut count = self.data.len();
if self.data.len() >= 3 {
sum -= max;
count -= 1;
}
sum / count as f64
} }
} }
fn add(&mut self, val: f32) { fn add(&mut self, val: f64) {
if self.data.capacity() == self.data.len() { if self.data.capacity() == self.data.len() {
self.data[self.index] = val; self.data[self.index] = val;
@ -160,18 +175,18 @@ pub async fn download_feedback_chunks(url: &str, into_file: &str, rep: DlReporte
// Update the number of bytes downloaded since the last report // Update the number of bytes downloaded since the last report
last_bytecount += datalen; last_bytecount += datalen;
let t_elapsed = t_last_speed.elapsed()?.as_millis(); let t_elapsed = t_last_speed.elapsed()?.as_secs_f64();
// Update the reported download speed after every 5MB or every second // Update the reported download speed after every 5MB or every second
// depending on what happens first // depending on what happens first
if last_bytecount > 5_000_000 || t_elapsed >= 1000 { if last_bytecount >= 3_000_000 || t_elapsed >= 0.8 {
// Update rolling average // Update rolling average
average_speed.add( average_speed.add(
(last_bytecount as f32) / (1_000.0 * t_elapsed as f32) ((last_bytecount as f64) / t_elapsed) / 1_000_000.0
); );
speed_mbps = average_speed.value(); speed_mbps = average_speed.value() as f32;
// Reset the time and bytecount // Reset the time and bytecount
last_bytecount = 0; last_bytecount = 0;
@ -261,13 +276,18 @@ pub async fn download_feedback_multi(url: &str, into_file: &str, rep: DlReporter
let rep_task = rep.clone(); let rep_task = rep.clone();
let mut t_last = t_start.clone();
joiners.push(tokio::task::spawn(async move { joiners.push(tokio::task::spawn(async move {
let rep = rep_task; let rep = rep_task;
let mut update_counter: i32 = 0; //let mut dl_speeds = vec![0.0_f32; conn_count as usize];
let mut dl_speeds = vec![0.0_f32; conn_count as usize];
let mut progresses = vec![0; conn_count as usize]; let mut progresses = vec![0; conn_count as usize];
let mut progress_last: u64 = 0;
let mut average_speed = RollingAverage::new(10);
while let Some(update) = rx.recv().await { while let Some(update) = rx.recv().await {
match update.status { match update.status {
@ -278,34 +298,43 @@ pub async fn download_feedback_multi(url: &str, into_file: &str, rep: DlReporter
}, },
DlStatus::Update { DlStatus::Update {
speed_mbps, speed_mbps: _,
bytes_curr bytes_curr
} => { } => {
dl_speeds[update.id as usize] = speed_mbps; //dl_speeds[update.id as usize] = speed_mbps;
progresses[update.id as usize] = bytes_curr; progresses[update.id as usize] = bytes_curr;
if update_counter >= 0 {
update_counter = 0;
let speed = dl_speeds.iter().sum(); let progress_curr = progresses.iter().sum();
let curr = progresses.iter().sum(); let progress_delta = progress_curr - progress_last;
let t_elapsed = t_last.elapsed().unwrap().as_secs_f64();
rep.send(DlStatus::Update { let speed_mbps = average_speed.value() as f32;
speed_mbps: speed,
bytes_curr: curr // currently executes always, but might change
}); if progress_delta >= 5_000_000 {
average_speed.add(
((progress_delta as f64) / 1_000_000.0) / t_elapsed
);
progress_last = progress_curr;
t_last = SystemTime::now();
} else {
update_counter += 1;
} }
rep.send(DlStatus::Update {
speed_mbps: speed_mbps,
bytes_curr: progress_curr
});
}, },
DlStatus::Done { DlStatus::Done {
duration_ms: _ duration_ms: _
} => { } => {
dl_speeds[update.id as usize] = 0.0; //dl_speeds[update.id as usize] = 0.0;
}, },