Più in generale, penso che si stia cercando un modo per fornire una misura istantanea della velocità di trasferimento, che è generalmente ottenuta in media su un breve periodo.
Il problema è generalmente che per essere reattivi, il periodo è in genere estremamente piccolo, il che porta all'effetto yoyo.
Vorrei proporre uno schema molto semplice, modelliamolo.
Pensare a una velocità della curva (y) nel tempo (x).
la Velocità istantanea, non è altro che leggere y per la corrente x (x0).
la velocità media, non è altro che Integral(f(x), x in [x0-T,x0])/T
lo schema che propongo è quello di applicare un filtro, per dare più peso agli ultimi momenti, pur tenendo conto dei momenti passati.
Si può implementare facilmente come g(x,x0,T) = 2 * (x - x0) + 2T
che è un semplice triangolo superficie T.
E ora si può calcolare Integral(f(x)*g(x,x0,T), x in [x0-T,x0])/T
, che dovrebbe funzionare, perché entrambe le funzioni sono sempre positivi.
Ovviamente si potrebbe avere un diverso g
purché sia sempre positivo nell'intervallo specificato e che il suo integrale nell'intervallo sia T (in modo che la sua stessa media sia esattamente 1).
Il vantaggio di questo metodo è che, poiché si dà più peso agli eventi immediati, è possibile rimanere abbastanza reattivi anche se si considerano intervalli di tempo più ampi (in modo che la media sia più precisa e meno suscettibile di singhiozzo).
Inoltre, quello che ho visto raramente a meno di pensare avrebbe fornito stime più precise sarebbe quello di correlare il tempo utilizzato per il calcolo della media per il tempo residuo stimato:
- se scarico un file 5KO, sta andando per essere caricato in un istante, non è necessario stimare
- se scarico un file di 15 Mo, ci vorranno tra 2 minuti circa, quindi mi piacerebbe che le stime dicessero ... ogni 5 secondi?
- se scarico un file 1.5 Go, ci vorranno ... circa 200 minuti (con la stessa velocità) ...vale a dire 3h20m ... forse che una stima ogni minuto sarebbe sufficiente?
Quindi, più lungo sarà il download, meno reattivo è necessario essere e più posso calcolare la media. In generale, direi che una finestra potrebbe coprire il 2% del tempo totale (forse tranne le poche prime stime, perché la gente apprezza il feedback immediato). Inoltre, è sufficiente indicare l'avanzamento per% intero alla volta. Se il compito è lungo, ero disposto ad aspettare comunque.
obbligatoria riferimento xkcd: http://www.xkcd.com/612/ – jason
duplicato di http://stackoverflow.com/questions/933242/smart-progress-bar-eta-computation –