gpt4 book ai didi

javascript - 计算每秒字节数(流畅的方式)

转载 作者:数据小太阳 更新时间:2023-10-29 04:33:45 25 4
gpt4 key购买 nike

我正在寻找一种解决方案来计算每秒传输的字节数 重复调用的函数(如下)。由于它的不准确性,我不想想简单地将传输的字节数除以经过的总时间:这导致在运行几分钟后无法显示快速的速度变化。

预设(大约每 50 毫秒调用一次):

function uploadProgress(loaded, total){
var bps = ?;
$('#elem').html(bps+' bytes per second');
};
  • 如何获取(仅)最后 n 秒的平均每秒字节数,这是个好主意吗?
  • 还有哪些其他方法可用于计算不闪烁但精确的 bps 值?

最佳答案

你的第一个想法不错,它叫做moving average ,并且如果您定期调用更新函数,您只需要保持一个恒定长度的队列(FIFO buffer):

var WINDOW_SIZE = 10;
var queue = [];

function updateQueue(newValue) {
// fifo with a fixed length
queue.push(newValue);
if (queue.length > WINDOW_SIZE)
queue.shift();
}

function getAverageValue() {

// if the queue has less than 10 items, decide if you want to calculate
// the average anyway, or return an invalid value to indicate "insufficient data"

if (queue.length < WINDOW_SIZE) {

// you probably don't want to throw if the queue is empty,
// but at least consider returning an 'invalid' value in order to
// display something like "calculating..."

return null;
}

// calculate the average value
var sum = 0;
for (var i = 0; i < queue.length; i++) {
sum += queue[i];
}
return sum / queue.length;
}

// calculate the speed and call `updateQueue` every second or so
var updateTimer = setInterval(..., 1000);

避免计算速度突然变化的更简单方法是使用 low-pass filter . PT1 滤波器的简单离散近似为:

Discrete PT1 filter approximation

其中 u[k] 是样本 k 处的输入(或实际值),y[k] 是样本 k 处的输出(或过滤值),T 是时间常数(较大的 T 意味着 y 将更慢地跟随 u

这将被翻译成类似的东西:

var speed = null;
var TIME_CONSTANT = 5;

function updateSpeed(newValue) {
if (speed === null) {
speed = newValue;
} else {
speed += (newValue - speed) / TIME_CONSTANT;
}
}

function getFilteredValue() {
return speed;
}

两种解决方案都会给出相似的结果(至少对于您的目的而言),而后者似乎更简单一些(并且需要更少的内存)。

此外,我不会那么快地更新值。过滤只会以50ms的刷新率将“闪烁”变为“摆动”。我认为没有人希望以超过每秒一次(甚至几秒)的刷新率显示上传速度。

关于javascript - 计算每秒字节数(流畅的方式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18620038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com