2010-05-06 18 views

risposta

101

Un exponential moving average è perfetto per questo. Fornisce un modo per uniformare la media in modo che ogni volta che si aggiunge un nuovo campione i campioni più vecchi diventino sempre meno importanti per la media generale. Sono ancora considerati, ma la loro importanza diminuisce in modo esponenziale - da qui il nome. E dal momento che si tratta di una media "in movimento", è sufficiente mantenere un solo numero in giro.

Nel contesto di misurare la velocità di download la formula sarà simile a questa:

averageSpeed = SMOOTHING_FACTOR * lastSpeed + (1-SMOOTHING_FACTOR) * averageSpeed; 

SMOOTHING_FACTOR è un numero compreso tra 0 e 1. Più alto è questo numero, i campioni più velocemente anziani vengono scartati. Come puoi vedere nella formula, quando SMOOTHING_FACTOR è 1 stai semplicemente usando il valore dell'ultima osservazione. Quando SMOOTHING_FACTOR è 0 averageSpeed non cambia mai. Quindi, vuoi qualcosa in mezzo, e di solito un valore basso per ottenere una levigatezza decente. Ho trovato che 0.005 fornisce un valore di smoothing piuttosto buono per una velocità di download media.

lastSpeed è l'ultima velocità di download misurata. È possibile ottenere questo valore eseguendo un timer ogni secondo circa per calcolare quanti byte sono stati scaricati dall'ultima volta che è stato eseguito.

averageSpeed è, ovviamente, il numero che si desidera utilizzare per calcolare il tempo rimanente stimato. Inizializza alla prima misurazione lastSpeed che ottieni.

+2

Semplice, ma sembra buono! – mpen

+0

Non chiaro sul tempo rimanente per il download. In grado di calcolare la velocità media dal movimento di campionamento. – byJeevan

5

Penso che il meglio che puoi fare è dividere la dimensione del file rimanente per la velocità media di download (scaricata fino ad ora divisa per quanto tempo hai scaricato). Questo fluttuerà un po 'per iniziare, ma sarà sempre più stabile più a lungo si scarica.

+0

ma considera il caso in cui l'utente stava scaricando nelle ultime 24 ore e pochi minuti fa la connessione Internet era appena interrotta e l'utente vede il tempo di download non infinito. È un bug o una funzionalità? – TiansHUo

+0

Il tempo di download tenderà all'infinito se la connessione rimane interrotta. –

+1

Sì ... non penso che mi piaccia questa soluzione. Mette troppo l'accento sulla velocità di download ore fa. Ciò che mi infastidisce in particolare è che i primi secondi di download sono in genere piuttosto instabili mentre salgono (i torrent si connettono a più semi) o rallentano (il powerboost di Shaw si esaurisce) e quindi penso che dovrebbero essere completamente scontati. – mpen

7
speed=speedNow*0.5+speedLastHalfMinute*0.3+speedLastMinute*0.2 
+1

: ponderato, ponendo l'accento su un tempo più recente. – mpen

+0

@mark, sì lo prendi – TiansHUo

+0

+1 questo è caldo! –

2

In estensione alla risposta di Ben Dolman, è anche possibile calcolare la fluttuazione all'interno dell'algoritmo. Sarà più liscio, ma prevarrà anche la velocità media.

Qualcosa di simile:

prediction = 50; 
depencySpeed = 200; 
stableFactor = .5; 
smoothFactor = median(0, abs(lastSpeed - averageSpeed), depencySpeed); 
smoothFactor /= (depencySpeed - prediction * (smoothFactor/depencySpeed)); 
smoothFactor = smoothFactor * (1 - stableFactor) + stableFactor; 
averageSpeed = smoothFactor * lastSpeed + (1 - smoothFactor) * averageSpeed; 

fluttuazione o no, sarà sia stabile come l'altro, con i giusti valori per la previsione e depencySpeed; devi giocarci un po 'a seconda della velocità di internet. Queste impostazioni sono perfette per una velocità media di 600 kB/s mentre fluttua da 0 a 1 MB.

+1

Forse potresti basare la tua previsione sui download precedenti, allora? Il tempo supplementare diventerebbe più accurato. – mpen

3

Ho scritto un algoritmo anni fa per prevedere il tempo rimanente in un programma di imaging e multicasting del disco che utilizzava una media mobile con un ripristino quando il throughput corrente non rientrava in un intervallo predefinito. Manterrebbe le cose lisce a meno che non succedesse qualcosa di drastico, poi si adatterebbe rapidamente e poi tornerebbe di nuovo alla media mobile. Vedi esempio grafico qui:

enter image description here

La linea blu spessa in quel grafico esempio è la velocità effettiva nel tempo. Si noti il ​​basso throughput durante la prima metà del trasferimento e poi salta drammaticamente nella seconda metà. La linea arancione è una media complessiva. Si noti che non si regola mai abbastanza lontano da dare sempre una previsione accurata di quanto tempo ci vorrà per finire. La linea grigia è una media mobile (ad es.la media degli ultimi N punti di dati - in questo grafico N è 5, ma in realtà N potrebbe necessitare di essere più grande per essere abbastanza regolare). Si recupera più rapidamente, ma richiede ancora un po 'di tempo per adattarsi. Ci vorrà più tempo per l'N maggiore. Quindi se i tuoi dati sono piuttosto rumorosi, allora N dovrà essere più grande e il tempo di recupero sarà più lungo.

La linea verde è l'algoritmo che ho usato. Va avanti come una media mobile, ma quando i dati si muovono al di fuori di un intervallo predefinito (indicato dalle sottili linee blu e gialle), ripristina la media mobile e salta immediatamente. L'intervallo predefinito può anche essere basato sulla deviazione standard in modo che possa adattarsi a quanto i dati sono disturbati automaticamente. Ho appena gettato questi valori in Excel per disegnarli per questa risposta, quindi non è perfetto, ma hai un'idea.

I dati potrebbero essere inventati per fare in modo che questo algoritmo non sia un buon predittore del tempo rimanente. La linea di fondo è che è necessario avere un'idea generale di come ci si aspetta che i dati si comportino e scegliere un algoritmo di conseguenza. Il mio algoritmo ha funzionato bene per i set di dati che stavo vedendo, quindi abbiamo continuato a utilizzarlo.

Un altro suggerimento importante è che in genere gli sviluppatori ignorano i tempi di configurazione e di smontaggio nelle barre di avanzamento e nei calcoli delle stime temporali. Ciò si traduce nell'elegante barra di avanzamento del 99% o 100% che rimane inutilizzata per un lungo periodo (mentre le cache vengono svuotate o altri lavori di pulizia stanno accadendo) o stime iniziali quando si verifica la scansione di directory o altri lavori di installazione, accumulando tempo ma non accumulato alcun progresso percentuale, che getta via tutto. È possibile eseguire diversi test che includono i tempi di impostazione e di smantellamento e fornire una stima di quanto tempo sono in media o in base alle dimensioni del lavoro e aggiungere il tempo alla barra di avanzamento. Ad esempio, il primo 5% del lavoro è il lavoro di installazione e l'ultimo 10% è un lavoro di smontaggio e quindi l'85% nel mezzo è il download o qualsiasi altro processo ripetitivo di tracciamento. Questo può essere di grande aiuto.

+1

Buoni consigli! Grazie per aver condiviso. – mpen

Problemi correlati