我们都在“剩下的X分钟”对话框中玩得很开心,这似乎过于简单了,但我们怎样才能改进呢?
实际上,输入是直到当前时间的下载速度集合,我们需要使用它来估计完成时间,可能有一定的确定性,例如“剩余20分钟”,使用一些Y%置信区间。
执行此操作的代码可以放在一个小库中,并在各个项目中使用,所以它真的很难吗?你会怎么做?你对以前的下载速度有什么加权?
或者是否已经有一些开源代码?
编辑:总结:
答案 0 :(得分:12)
更一般地说,我认为您正在寻找一种方法来快速确定传输速度,这通常是通过一小段时间内的平均速度获得的。
问题通常在于,为了被动,时间通常非常小,这会导致yoyo效应。
我会提出一个非常简单的方案,让我们对它进行建模。
考虑曲线速度(y)随时间的推移(x)。
即时速度,只是读取当前x(x0)的y。
平均速度不超过Integral(f(x), x in [x0-T,x0]) / T
我建议的方案是应用过滤器,以便在最后时刻给予更多权重,同时仍然考虑过去的时刻。
它可以很容易地实现为g(x,x0,T) = 2 * (x - x0) + 2T
,它是表面T的简单三角形。
现在你可以计算Integral(f(x)*g(x,x0,T), x in [x0-T,x0]) / T
,这应该有效,因为两个函数都是正的。
当然,只要在给定的时间间隔内它总是正数并且它在间隔上的积分是T(因此它自己的平均值正好是1),你可以有一个不同的g
。
这种方法的优点在于,因为你给予即时事件更多的权重,即使你考虑更大的时间间隔(使平均值更精确,更不容易出现打嗝),你仍可以保持相当的反应性。
此外,我很少看到但想到会提供更精确的估算,将用于计算平均值的时间与估计的剩余时间相关联:
因此,下载的时间越长,我需要的反应越少,我的平均值就越高。一般来说,我会说一个窗口可以覆盖总时间的2%(可能除了少数的初步估计之外,因为人们喜欢立即反馈)。此外,一次指示整个%的进展就足够了。如果任务很长,我还是准备等待。
答案 1 :(得分:8)
我想知道,状态估算技术会在这里产生好的效果吗?卡尔曼过滤器之类的东西?
基本上,您通过查看当前模型来预测未来,并在每个时间步骤更改模型以反映现实世界的变化。我认为这种技术用于估算笔记本电池剩余的时间,也可能因使用情况,电池使用年限等因素而异。
请参阅http://en.wikipedia.org/wiki/Kalman_filter以获得更深入的算法说明。
过滤器还提供方差度量,可用于表示您对估计值的置信度(尽管如其他答案所述,可能不是向最终用户显示此信息的最佳方法)
是否有人知道这是否实际用于下载(或文件复制)估算?
答案 2 :(得分:4)
不要混淆您的用户,提供超出他们需要的信息。我在考虑置信区间。跳过它。
互联网下载时间变化很大。微波会干扰WiFi。使用情况因时间,星期几,假日和新激动人心的游戏发布而异。服务器现在可能负载很重。如果您将笔记本电脑带到咖啡馆,结果将与在家不同。因此,您可能无法依赖历史数据来预测下载速度的未来。
如果您无法准确估算剩余时间,则不要欺骗您的用户,提供此类估算值。
如果您知道必须下载多少数据,可以提供已完成的百分比。
如果您根本不知道,提供“心跳” - 一个移动的用户界面,向用户显示事情正在发挥作用,即使您不知道还有多长时间。
答案 3 :(得分:2)
改善估计的时间本身:直观地说,我猜测网络连接的速度是一系列临时平均速度的随机值 - 事物以一个速度嘀嗒,然后突然变慢或加速。
然后,一个选项可能是将前一组速度加权一些指数,以便最近的值得到最强的加权。这样,随着先前的平均速度进一步进入过去,其对当前平均值的影响减小。
但是,如果速度随机波动,可能值得将指数顶部变平(例如使用Gaussian filter),以避免过大的波动。
总而言之,我正在考虑测量标准偏差(可能仅限于最后N分钟)并使用它来生成应用于输入的高斯滤波器,然后使用标准偏差限制引用的精度
但是,如何将标准偏差计算限制在最后N分钟?你怎么知道使用多长时间?
或者,有模式识别的可能性来检测我们是否达到了稳定的速度。
答案 4 :(得分:0)
我自己也考虑过这个问题。我的答案从计算当前(以及未来)传输速率时的保守开始,并包括更长时间的平均,以获得更稳定的估计。也许低通过滤显示的时间,以便在2分钟到2天之间不会跳跃。
我不认为置信区间会有所帮助。大多数人都无法解释它,它只会显示更多的猜测。