如何估算剩余(准确)的下载时间?
当然你可以用当前的下载速度来分割剩余的文件大小,但是如果你的下载速度波动(这将会),这不会产生一个很好的结果。 什么是更顺畅的倒计时algorithm?
指数移动平均线对此非常重要。 它提供了一种平滑平均值的方法,以便每次添加新样本时,较老的样本对整体平均值的重要性就会降低。 它们仍然被考虑在内,但是它们的重要性成倍地下降 – 因此这个名字。 而由于这是一个“移动”的平均水平,你只需要保持一个单一的数字。
在测量下载速度的情况下,公式将如下所示:
averageSpeed = SMOOTHING_FACTOR * lastSpeed + (1-SMOOTHING_FACTOR) * averageSpeed;
SMOOTHING_FACTOR
是介于0和1之间的数字。此数字越高,旧的采样越快。 正如你在公式中看到的那样,当SMOOTHING_FACTOR
是1时,你只是简单地使用你最后的观察值。 当averageSpeed
为0时, averageSpeed
永不改变。 所以,你需要介于两者之间的东西,通常价值很低,以获得体面的平滑。 我发现0.005为平均下载速度提供了相当不错的平滑值。
lastSpeed
是上次测量的下载速度。 您可以通过每秒运行计时器来获取此值,以计算自上次运行以来已下载的字节数。
显然, averageSpeed
是您希望用来计算剩余估计时间的数字。 将其初始化为您获得的第一个lastSpeed
一个lastSpeed
测量值。
speed=speedNow*0.5+speedLastHalfMinute*0.3+speedLastMinute*0.2
我认为你所能做的最好的事情是把剩下的文件大小除以平均下载速度(到目前为止下载的时间除以你下载的时间)。 这会起伏不定,但下载时间越长越稳定。
我几年前写了一个algorithm来预测磁盘映像和多播程序中的剩余时间,当当前的吞吐量超出预定义的范围时,该程序使用带有重置的移动平均值。 如果不发生剧烈的事情,它会保持顺畅,然后它会迅速调整,然后再次回到移动平均线。 请看这里的示例图表:
该示例图中的粗蓝线是随着时间的推移的实际吞吐量。 注意转移的上半年的低吞吐量,然后在下半年急剧上升。 橙色线是一个整体的平均水平。 请注意,它永远不会做出足够的调整,以至于无法准确预测完成所需的时间。 灰线是移动平均值(即最后N个数据点的平均值 – 在该图中N是5,但实际上,N可能需要更大才能足够平滑)。 它恢复得更快,但仍需要一段时间来调整。 N越大,花费的时间越多。 所以如果你的数据非常嘈杂,那么N将不得不更大,恢复时间会更长。
绿线是我使用的algorithm。 它就像移动平均线一样,但当数据移动到预定义的范围之外(由浅蓝色和黄色的细线指定)时,它会重置移动平均值并立即跳转。 预定义的范围也可以基于标准偏差,因此可以自动调整数据的嘈杂程度。 我只是把这些价值投入到Excel来为他们绘制这个答案,所以这不是完美的,但你明白了。
数据可以被devise成使得该algorithm不能很好地预测剩余时间。 底线是你需要有一个大概的想法,你如何期望数据的行为,并select相应的algorithm。 我的algorithm对于我所看到的数据集效果很好,所以我们继续使用它。
另一个重要的提示是,通常开发人员在进度条和时间估算计算中忽略设置和拆卸时间。 这会导致永久性的99%或100%进度条(在高速caching正在刷新或正在进行其他清理工作的情况下),或者在扫描目录或其他安装程序时发生的早期估计,产生时间但没有累积任何百分比的进展,从而抛开一切。 您可以运行多个包含设置和拆卸时间的testing,并根据作业的大小估算这些时间的平均值,并将这些时间添加到进度栏。 例如,前5%的工作是安装工作,最后的10%是拆卸工作,然后中间的85%是下载或任何重复的过程。 这也可以帮助很多。
在Ben Dolman的回答中,还可以计算algorithm中的波动。 这会更加顺利,但也会预测平均速度。
像这样的东西:
prediction = 50; depencySpeed = 200; stableFactor = .5; smoothFactor = median(0, abs(lastSpeed - averageSpeed), depencySpeed); smoothFactor /= (depencySpeed - prediction * (smoothFactor / depencySpeed)); smoothFactor = smoothFactor * (1 - stableFactor) + stableFactor; averageSpeed = smoothFactor * lastSpeed + (1 - smoothFactor) * averageSpeed;
波动或不波动,它将是稳定的另一方面,正确的值预测和依赖速度; 你必须根据你的网速来玩一下。 这个设置非常适合600 kB / s的平均速度,但是波动从0到1MB。