Bien sûr, vous pourriez diviser le reste de la taille du fichier par le courant de la vitesse de téléchargement, mais si votre vitesse de téléchargement varie (et il le fera), ce n'est pas de produire un très joli résultat. Qu'est ce qu'un meilleur algorithme pour produire plus lisse comptes à rebours?
Réponses
Trop de publicités?Une moyenne mobile exponentielle est excellent pour cela. Il fournit un moyen de lisser votre moyenne, de sorte que chaque fois que vous ajoutez un nouvel échantillon le plus âgé des échantillons de devenir de moins en moins important à la moyenne globale. Ils sont toujours considérés, mais leur importance diminue de façon exponentielle, d'où le nom. Et puisque c'est un "déplacement" de la moyenne, vous ne devez avoir qu'un seul nombre autour de.
Dans le contexte de la mesure de la vitesse de téléchargement de la formule pourrait ressembler à ceci:
averageSpeed = SMOOTHING_FACTOR * lastSpeed + (1-SMOOTHING_FACTOR) * averageSpeed;
SMOOTHING_FACTOR
est un nombre entre 0 et 1. Plus ce nombre est grand, plus vite plus anciens échantillons sont mis au rebut. Comme vous pouvez le voir dans la formule, lorsque SMOOTHING_FACTOR
est 1, vous utilisez simplement la valeur de votre dernière observation. Lors de l' SMOOTHING_FACTOR
0 averageSpeed
ne change jamais. Donc, vous voulez quelque chose entre les deux, et généralement une faible valeur pour obtenir décent de lissage. J'ai trouvé que de 0,005 offre un très bon lissage de la valeur moyenne de la vitesse de téléchargement.
lastSpeed
est la dernière mesure de la vitesse de téléchargement. Vous pouvez obtenir cette valeur par l'exécution d'un timer toutes les secondes pour calculer combien d'octets ont téléchargé depuis la dernière fois que vous avez couru.
averageSpeed
est, de toute évidence, le numéro que vous souhaitez utiliser pour calculer une estimation de votre temps restant. Initialiser ce pour la première lastSpeed
de la mesure que vous obtenez.
Je pense que le mieux que vous pouvez faire est de diviser le reste de la taille du fichier par la moyenne de la vitesse de téléchargement (téléchargé jusqu'à présent divisé en combien de temps vous avez été en téléchargement). Cela va fluctuer un peu au début, mais il sera de plus en plus stable, le plus que vous téléchargez.
Dans le prolongement de Ben Dolman de réponse, vous pouvez aussi calculer les fluctuations à l'intérieur de l'algorithme. Il sera plus lisse, mais il permettra également de prédire la avarage de vitesse.
Quelque chose comme ceci:
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;
La Fluctuation ou pas, il sera à la fois aussi stable que les autres, avec les bonnes valeurs pour la prédiction et depencySpeed; vous avez à jouer avec elle un peu en fonction de votre vitesse d'internet. Ces paramètres sont parfaites pour un avarage de la vitesse de 600 ko/s alors qu'il varie de 0 à 1 mo.