2011-07-06 4 views
3

Je crée un programme et je veux donner à l'utilisateur des informations sur les temps estimés tous les 1000 éléments traités. Je calcul du temps de cette façon:Calculer le temps estimé dans un programme

  • C = éléments déjà traités
  • MAX = éléments Max pour traiter
  • Tp = temps écoulé
  • Te = temps estimé

En théorie, la relation entre les éléments traités et le temps écoulé est égale à la relation entre le reste des éléments et le reste du temps, donc ma formule est:

(C/Tp) = (MAX - C)/(Te - Tp)

donc je dois résoudre Te en faisant:

(Te - Tp) = (MAX - C) Tp/C

et enfin:

Te = (MAX - C) Tp/C + Tp

Je pense que la résolution est correcte, mais clairement, le fonctionnement ne tend pas à 0 comme C etTp grandit, donc je suis sûr que je fais une erreur stupide, mais je ne pouvais pas trouver.

Quelques idées s'il vous plaît?

Répondre

5

Je pense que votre équation initiale est légèrement, plutôt que ce que vous avez devrait être

(C/Tp) = (MAX - C)/Te 

puisque nous estimer le temps nécessaire pour traiter chaque élément, et cela devrait être constante et égale dans la le passé et le futur. Cela vous donnera une équation finale

Te = (MAX - C)*(Tp/C) 

qui tend à zéro comme prévu.

(Cela suppose que Te est l'heure gauche, pas le temps total estimé)

+0

C'est exactement ce que je recherche: durée estimée restante – Killrazor

5

Je pense que c'est bon. Vous pensez probablement au "temps restant", qui dans votre cas serait Tr = Te - Tp. Celui-ci a tendance à 0.

Début: C = 0, ce qui entraîne une division par zéro. C'est logique, vous n'avez aucune indication de vitesse, donc il n'y a pas d'estimation.

Fin: C = MAX, MAX-C = 0, donc Te = Tp. C'est logique, l'estimation est maintenant égale au temps écoulé. A mi-chemin, C = MAX/2, MAX-C = C, donc Te = C * Tp/C + Tp, ou environ deux fois la quantité de courant passée. Logique.

Un quart, C = MAX/4, MAX-C = 3 * C, donc Te = 3 * C * Tp/C + Tp, ou Te = 4 * Tp. Fait sens, encore une fois.

3

Vous ne devriez pas prendre tout le temps écoulé.

Vous devriez simplement prendre la moyenne des 4 ou 5 derniers morceaux de 1000 objets. Parce que cela vous donnera une idée plus précise de la vitesse actuelle de calcul.

t1,t2,t3,t4 = last 4 calculations 

thisIteration = timePassedSinceLastCheck/1000 //Avg time per object 
Te = (Max-C)*Avg(t1,t2,t3,t4,thisIteration) 
+0

Correction de mes maths. –

+0

Bon avis, mais cela dépend vraiment de la situation. Certains processus bénéficieront d'une estimation globale (par exemple, de nombreux pics mais de moyennes relativement stables) et d'une fenêtre mobile (par exemple des processus exponentiels ou des fichiers copiés par incrémentation de taille ou ...) – KillianDS

+0

Je ne suis pas entièrement sûr. Le vôtre donnerait une meilleure estimation compte tenu des environnements en constante évolution, car la «vitesse» se rétablirait rapidement après une période de lenteur. L'autre stabilisera la dernière heure et supposera que les interruptions jusqu'à présent sont représentatives de l'avenir. – dascandy

Questions connexes