更一般地說,我認爲你正在尋找一種方法來給出傳輸速度的即時度量,這通常是通過一段時間內的平均值獲得的。
問題是,一般來說,爲了反應,期間通常非常小,這會導致yoyo效應。
我會提出一個非常簡單的方案,讓我們對它進行建模。
想象隨着時間(x)的曲線速度(y)。
即時速度,不超過當前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文件,這是怎麼回事如果我下載了一個15Mo的文件,它大約需要2分鐘,所以我想估計說......每5秒鐘一次?
- 如果我下載一個1.5 Go文件,它會花費大約200分鐘(以相同的速度)......也就是說3h20m ......也許每分鐘估計就足夠了?
因此,下載需要的時間越長,我需要的反應越少,我可以平均得越多。一般來說,我會說一個窗口可以覆蓋總時間的2%(可能除了少數第一次估計,因爲人們欣賞即時反饋)。此外,一次顯示全部進度是足夠的。如果任務很長,我仍然準備等待。
強制xkcd參考:http://www.xkcd.com/612/ – jason 2009-12-10 18:53:49
重複http://stackoverflow.com/questions/933242/smart-progress-bar-eta-computation – 2013-08-30 02:03:05