假设您想要计算剩余下载时间,并且您拥有所需的所有信息,即:文件大小,大小,大小,经过的时间,瞬间dl速度等等.你如何计算剩余的dl时间?
当然,直接的方式是:尺寸左/瞬间dl速度,或:(经过的时间/尺寸)*尺寸左.只有第一个会受瞬时速度的偏差影响,后者不能很好地适应速度的变化.
必须是一些更聪明的方法,对吧?查看您目前使用uTorrent下载的盗版软件和音乐.很容易注意到它比以前提到的简单计算更有用.实际上,我注意到有时当dl速度下降时,剩余的时间也会下降一段时间,直到它重新调整为止.
Cha*_*rch 12
好吧,正如你所说,使用绝对当前的下载速度并不是一个好方法,因为它往往会波动.然而,像整体平均值这样的东西也不是一个好主意,因为那里也可能存在很大的波动.
考虑我是否与其他9个人同时开始下载文件.我只获得正常速度的10%,但在文件的中途,另外9个完成.现在我的速度是我开始时的10倍.我最初的10%速度不应该是"剩下多少时间?"的一个因素.再计算.
就个人而言,我可能会在过去30秒左右取平均值,并使用它.这应该根据最近的速度进行计算,而不会大幅波动.30秒可能不是正确的数量,需要一些实验来计算出好的数量.
另一个选择是设置一种"波动阈值",在速度变化超过该阈值之前,您不会进行任何重新计算.例如(随机数,同样需要实验),您可以将阈值设置为10%.然后,如果您以100kb/s的速度下载,则在下载速度变为低于90kb/s或110kb/s之前,不会重新计算剩余时间.如果发生其中一个更改,则重新计算时间并设置新阈值.
Dre*_*ins 10
您可以使用平均算法,其中旧值线性衰减.如果S_n是时间n的速度而A_ {n-1}是时间n-1的平均值,则按如下方式定义平均速度.
A_1 = S_1
A_2 =(S_1 + S_2)/ 2
A_n = S_n /(n-1)+ A_ {n-1}(1-1 /(n-1))
在英语中,这意味着过去测量发生的时间越长,重要性就越小,因为它的重要性已经衰退.
将其与常规平均算法进行比较:A_n = S_n/n + A_ {n-1}(1-1/n)
你也可以让它几何衰减,这会对最近的速度产生很大的影响:A_n = S_n/2 + A_ {n-1}/2
如果速度为4,3,5,6,则A_4 = 4.5(简单平均值)
A_4 = 4.75(线性衰减)
A_4 = 5.125(几何衰减)
请注意$n+1(不$n)是由于PHP的数组被零索引而导致的当前数据点的数量.要匹配上面的示例集n == $n+1或n-1 == $n
<?php
$s = [4,3,5,6];
// average
$a = [];
for ($n = 0; $n < count($s); ++$n)
{
if ($n == 0)
$a[$n] = $s[$n];
else
{
// $n+1 = number of data points so far
$weight = 1/($n+1);
$a[$n] = $s[$n] * $weight + $a[$n-1] * (1 - $weight);
}
}
var_dump($a);
// linear decay
$a = [];
for ($n = 0; $n < count($s); ++$n)
{
if ($n == 0)
$a[$n] = $s[$n];
elseif ($n == 1)
$a[$n] = ($s[$n] + $s[$n-1]) / 2;
else
{
// $n = number of data points so far - 1
$weight = 1/($n);
$a[$n] = $s[$n] * $weight + $a[$n-1] * (1 - $weight);
}
}
var_dump($a);
// geometric decay
$a = [];
for ($n = 0; $n < count($s); ++$n)
{
if ($n == 0)
$a[$n] = $s[$n];
else
{
$weight = 1/2;
$a[$n] = $s[$n] * $weight + $a[$n-1] * (1 - $weight);
}
}
var_dump($a);
Run Code Online (Sandbox Code Playgroud)
产量
array (size=4)
0 => int 4
1 => float 3.5
2 => float 4
3 => float 4.5
array (size=4)
0 => int 4
1 => float 3.5
2 => float 4.25
3 => float 4.8333333333333
array (size=4)
0 => int 4
1 => float 3.5
2 => float 4.25
3 => float 5.125
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9089 次 |
| 最近记录: |