mpe*_*pen 58 algorithm estimation download
当然你可以将剩余的文件大小除以当前的下载速度,但如果你的下载速度波动(它会),这不会产生非常好的结果.什么是更好的算法,以产生更顺畅的倒计时?
Ben*_*man 118
一个指数移动平均线是为这个伟大的.它提供了一种平滑平均值的方法,这样每次添加新样本时,较旧的样本对整体平均值变得越来越重要.它们仍然被考虑,但它们的重要性呈指数下降 - 因此得名.而且由于它是一个"移动"的平均值,你只需要保持一个数字.
在测量下载速度的上下文中,公式如下所示:
averageSpeed = SMOOTHING_FACTOR * lastSpeed + (1-SMOOTHING_FACTOR) * averageSpeed;
Run Code Online (Sandbox Code Playgroud)
SMOOTHING_FACTOR是一个介于0和1之间的数字.该数字越大,丢弃的旧样本越快.正如您在公式中看到的那样,当SMOOTHING_FACTOR您为1时,您只是使用上次观察的值.什么时候SMOOTHING_FACTOR0 averageSpeed永远不会改变.所以,你想要介于两者之间的东西,通常是一个低值来获得适当的平滑.我发现0.005为平均下载速度提供了非常好的平滑值.
lastSpeed是最后测量的下载速度.您可以通过每秒运行一次计时器来获取此值,以计算自上次运行以来已下载的字节数.
averageSpeed显然,您想要用来计算估计剩余时间的数字.将其初始化为lastSpeed您获得的第一个测量值.
我在几年前编写了一个算法来预测磁盘映像和多播程序中剩余的时间,该程序在当前吞吐量超出预定义范围时使用带有重置的移动平均值.它会保持顺畅,除非发生剧烈的事情,然后它会迅速调整,然后再次回到移动平均线.请参见示例图表:
该示例图表中的粗蓝线是随时间变化的实际吞吐量.注意在传输的前半部分吞吐量低,然后在下半部分急剧上升.橙色线是整体平均值.请注意,它从未调整得足够远,无法准确预测完成所需的时间.灰线是移动平均线(即最后N个数据点的平均值 - 在该图中N为5,但实际上,N可能需要更大才能足够平滑).它恢复得更快,但仍需要一段时间才能调整.较大的N需要更多的时间.因此,如果您的数据非常嘈杂,那么N必须更大,恢复时间也会更长.
绿线是我使用的算法.它就像移动平均线一样,但当数据超出预定范围(由浅蓝色和黄色线指定)时,它会重置移动平均线并立即跳起.预定义范围也可以基于标准偏差,因此可以根据数据的自动噪声进行调整.我只是将这些值扔到Excel中以便为这个答案绘制图表,所以它并不完美,但你明白了.
可以设计数据以使该算法不能成为剩余时间的良好预测器.最重要的是,您需要大致了解数据的预期行为,并相应地选择算法.我的算法适用于我看到的数据集,因此我们继续使用它.
另一个重要提示是,开发人员通常会忽略进度条和时间估算计算中的设置和拆卸时间.这导致永久的99%或100%进度条长时间坐在那里(当缓存被冲洗或其他清理工作正在发生时)或者在扫描目录或其他设置工作时发生的早期估计,累积时间但不会产生任何百分比的进展,这会导致一切失败.您可以运行包含设置和拆卸时间的多个测试,并根据作业的大小估算这些时间的平均长度,并将该时间添加到进度条.例如,前5%的工作是设置工作,最后10%是拆解工作,然后中间的85%是下载或跟踪的任何重复过程.这也可以帮助很多.
speed=speedNow*0.5+speedLastHalfMinute*0.3+speedLastMinute*0.2
Run Code Online (Sandbox Code Playgroud)