15

我们都取笑过“剩余 X 分钟”对话框,这似乎太简单了,但我们该如何改进呢?

实际上,输入是截至当前时间的一组下载速度,我们需要使用它来估计完成时间,也许有确定性的指示,例如使用某个 Y% 置信区间的“剩余 20-25 分钟”。

这样做的代码可以放在一个小库中并在所有项目中使用,那么真的有那么难吗?你会怎么做?你会给以前的下载速度赋予什么权重?

还是已经有一些开源代码?

编辑:总结:

  1. 通过更好的算法/过滤器等提高估计完成时间。
  2. 提供间隔而不是单个时间('1h45-2h30 分钟'),或者只是限制精度('大约 2 小时')。
  3. 指出进展何时停止 - 尽管如果进展持续停止然后继续,我们应该能够处理它。也许“大约 2 小时,目前停滞不前”
4

5 回答 5

12

更一般地说,我认为您正在寻找一种方法来即时测量传输速度,这通常是通过一小段时间的平均值获得的。

问题一般是为了反应,周期通常极小,导致悠悠球效应。

我会提出一个非常简单的方案,让我们对其进行建模。

考虑曲线速度 (y) 随时间 (x) 的变化。

  1. Instant Speed,只不过是读取当前 x (x0) 的 y。

  2. 平均速度,不超过Integral(f(x), x in [x0-T,x0]) / T

  3. 我建议的方案是应用一个过滤器,给最后时刻更多的权重,同时仍然考虑过去的时刻。

它可以很容易地实现为g(x,x0,T) = 2 * (x - x0) + 2T表面 T 的简单三角形。

现在您可以计算Integral(f(x)*g(x,x0,T), x in [x0-T,x0]) / T,这应该可以工作,因为这两个函数总是正数。

当然g,只要它在给定区间内始终为正,并且它在区间上的积分为 T(因此它自己的平均值恰好为 1),您当然可以有不同的值。

这种方法的优点是,因为你给予即时事件更多的权重,即使你考虑更大的时间间隔,你也可以保持相当的反应(这样平均值更精确,更不容易打嗝)。

此外,我很少看到但认为会提供更精确估计的是将用于计算平均值的时间与估计的剩余时间相关联:

  • 如果我下载一个5ko文件,它会立即加载,无需估计
  • 如果我下载一个 15 Mo 的文件,大约需要 2 分钟,所以我想估计说......每 5 秒?
  • 如果我下载一个 1.5 Go 文件,这将需要......大约 200 分钟(以相同的速度)......也就是说 3 小时 20 分钟......也许每分钟估计一下就足够了?

因此,下载需要的时间越长,我需要的反应就越少,我可以平均越多。一般来说,我会说一个窗口可以覆盖总时间的 2%(也许除了少数初步估计,因为人们喜欢即时反馈)。此外,一次显示整个 % 的进度就足够了。如果任务很长,我无论如何都准备等待。

于 2009-12-10T18:51:31.923 回答
8

我想知道,状态估计技术会在这里产生好的结果吗?像卡尔曼滤波器这样的东西?

基本上,您通过查看当前模型来预测未来,并在每个时间步更改模型以反映现实世界的变化。我认为这种技术用于估计笔记本电脑电池的剩余时间,这也会根据使用情况、电池使用年限等而有所不同。

有关算法的更深入描述,请参见http://en.wikipedia.org/wiki/Kalman_filter 。

该过滤器还提供了一个方差度量,可用于指示您对估计的信心(尽管正如其他答案所提到的,将其展示给最终用户可能不是最好的主意)

有谁知道这是否实际用于下载(或文件复制)估计?

于 2009-12-10T16:14:25.033 回答
4

不要通过提供比他们需要的信息更多的信息来迷惑您的用户。我在考虑置信区间。跳过它。

互联网下载时间变化很大。微波炉会干扰 WiFi。使用情况因一天中的时间、一周中的某一天、假期和新的激动人心的游戏的发布而异。服务器现在可能负载很重。如果您将笔记本电脑带到咖啡馆,结果将与在家中有所不同。因此,您可能无法依靠历史数据来预测下载速度的未来。

如果您无法准确估计剩余时间,请不要通过提供这样的估计来欺骗您的用户。

如果您知道必须下载多少数据,您可以提供 % completed progress

如果您根本不知道,请提供“心跳” - 一个移动的 UI,它向用户显示事情正在运行,即使您不知道还剩多长时间。

于 2009-12-10T15:58:26.483 回答
2

改进估计时间本身:直觉上,我猜网络连接的速度是围绕一些临时平均速度的一系列随机值 - 事情以一种速度运行,然后突然变慢或加速。

那么,一种选择可能是通过某种指数对先前的一组速度进行加权,以便最近的值获得最强的权重。这样,随着先前的平均速度进一步进入过去,它对当前均值的影响就会减小。

但是,如果速度随机波动,则可能值得将指数的顶部变平(例如通过使用高斯滤波器),以避免太大的波动。

总而言之,我正在考虑测量标准偏差(可能限于最后 N 分钟)并使用它来生成应用于输入的高斯滤波器,然后使用标准偏差限制引用的精度。

但是,您如何将标准差计算限制在最后 N 分钟?你怎么知道使用多长时间?

或者,有模式识别的可能性来检测我们是否达到了稳定的速度。

于 2009-12-14T14:48:39.263 回答
0

我自己断断续续地考虑过这个问题。我的答案是在计算当前(以及未来)传输速率时保持保守,并包括在更长的时期内进行平均,以获得更稳定的估计。也许对显示的时间进行低通滤波,这样就不会在 2 分钟到 2 天之间跳跃。

我认为置信区间不会有帮助。大多数人无法解释它,它只会显示更多猜测的东西。

于 2009-12-10T15:59:49.007 回答