68 votes

Comment estimer le temps de téléchargement restant (avec précision)?

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?

128voto

Ben Dolman Points 1355

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.

7voto

TiansHUo Points 2682
speed=speedNow*0.5+speedLastHalfMinute*0.3+speedLastMinute*0.2

6voto

Andreas Brinck Points 23806

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.

3voto

Tim Points 773

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X