更一般地说,我认为您正在寻找一种方法来即时测量传输速度,这通常是通过一小段时间的平均值获得的。
问题一般是为了反应,周期通常极小,导致悠悠球效应。
我会提出一个非常简单的方案,让我们对其进行建模。
考虑曲线速度 (y) 随时间 (x) 的变化。
Instant Speed,只不过是读取当前 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
,这应该可以工作,因为这两个函数总是正数。
当然g
,只要它在给定区间内始终为正,并且它在区间上的积分为 T(因此它自己的平均值恰好为 1),您当然可以有不同的值。
这种方法的优点是,因为你给予即时事件更多的权重,即使你考虑更大的时间间隔,你也可以保持相当的反应(这样平均值更精确,更不容易打嗝)。
此外,我很少看到但认为会提供更精确估计的是将用于计算平均值的时间与估计的剩余时间相关联:
- 如果我下载一个5ko文件,它会立即加载,无需估计
- 如果我下载一个 15 Mo 的文件,大约需要 2 分钟,所以我想估计说......每 5 秒?
- 如果我下载一个 1.5 Go 文件,这将需要......大约 200 分钟(以相同的速度)......也就是说 3 小时 20 分钟......也许每分钟估计一下就足够了?
因此,下载需要的时间越长,我需要的反应就越少,我可以平均越多。一般来说,我会说一个窗口可以覆盖总时间的 2%(也许除了少数初步估计,因为人们喜欢即时反馈)。此外,一次显示整个 % 的进度就足够了。如果任务很长,我无论如何都准备等待。