Smoother download rate from HTTP

Crude filtering (low pass) of the download rate, over a 400msec
time window.
This commit is contained in:
James Turner
2013-10-21 23:08:55 +01:00
parent 48145fb234
commit 77aa2c9a9d

View File

@@ -789,17 +789,27 @@ void Client::receivedBytes(unsigned int count)
unsigned int Client::transferRateBytesPerSec() const
{
unsigned int e = d->timeTransferSample.elapsedMSec();
if (e < 400) {
// if called too frequently, return cahced value, to smooth out
// < 1 sec changes in flow
if (e > 400) {
// too long a window, ignore
d->timeTransferSample.stamp();
d->bytesTransferred = 0;
d->lastTransferRate = 0;
return 0;
}
if (e < 100) { // avoid really narrow windows
return d->lastTransferRate;
}
unsigned int ratio = (d->bytesTransferred * 1000) / e;
// run a low-pass filter
unsigned int smoothed = ((400 - e) * d->lastTransferRate) + (e * ratio);
smoothed /= 400;
d->timeTransferSample.stamp();
d->bytesTransferred = 0;
d->lastTransferRate = ratio;
return ratio;
d->lastTransferRate = smoothed;
return smoothed;
}
} // of namespace HTTP