In vielen Anwendungen gibt es einen Fortschrittsbalken für einen Dateidownload, eine Komprimierungsaufgabe, eine Suche usw. Wir alle verwenden häufig Fortschrittsbalken, um Benutzer darüber zu informieren, dass etwas passiert. Und wenn wir einige Details wissen, wie viel Arbeit geleistet wurde und wie viel noch zu tun ist, können wir sogar eine Zeitschätzung abgeben, häufig durch Extrapolation der Zeit, die benötigt wird, um das aktuelle Fortschrittsniveau zu erreichen.
(Quelle: jameslao.com )
Wir haben aber auch Programme gesehen, bei denen diese Time Left "ETA" -Anzeige nur komisch schlecht ist. Es wird behauptet, dass eine Dateikopie in 20 Sekunden fertig sein wird. Eine Sekunde später heißt es, dass es 4 Tage dauern wird, und dann flackert es erneut, um 20 Minuten zu sein. Es ist nicht nur nicht hilfreich, es ist auch verwirrend! Der Grund, warum die ETA so unterschiedlich ist, ist, dass die Fortschrittsrate selbst variieren kann und die Mathematik des Programmierers übermäßig empfindlich sein kann.
Apple umgeht dies, indem es nur genaue Vorhersagen vermeidet und nur vage Schätzungen gibt!
(Quelle: autodesk.com )
Das ist auch ärgerlich, habe ich Zeit für eine kurze Pause oder wird meine Aufgabe in 2 weiteren Sekunden erledigt sein? Wenn die Vorhersage zu unscharf ist, ist es sinnlos, überhaupt eine Vorhersage zu treffen.
Einfache aber falsche Methoden
Als ETA-Berechnung für den ersten Durchgang machen wir wahrscheinlich alle nur eine Funktion, als ob p der Bruchteil des Prozentsatzes ist, der bereits durchgeführt wurde, und t die Zeit ist, die bisher benötigt wurde. Wir geben t * (1-p) / p als Schätzung von aus Wie lange wird es dauern, bis es fertig ist? Dieses einfache Verhältnis funktioniert "OK", aber es ist auch schrecklich, besonders am Ende der Berechnung. Wenn Ihre langsame Download-Geschwindigkeit eine Kopie langsam über Nacht voranschreitet und schließlich am Morgen etwas einsetzt und die Kopie mit 100-facher Geschwindigkeit mit voller Geschwindigkeit beginnt, kann Ihre ETA bei 90% fertig "1 Stunde" und 10 Sekunden sagen später sind Sie bei 95% und die ETA wird "30 Minuten" sagen, was eindeutig eine peinlich schlechte Vermutung ist. In diesem Fall ist "10 Sekunden" eine viel, viel, viel bessere Schätzung.
In diesem Fall können Sie die Berechnung so ändern , dass zur Schätzung der ETA die aktuelle Geschwindigkeit und nicht die Durchschnittsgeschwindigkeit verwendet wird. Sie nehmen die durchschnittliche Download- oder Abschlussrate der letzten 10 Sekunden und verwenden diese Rate, um zu projizieren, wie lange der Abschluss dauern wird. Dies ist im vorherigen Beispiel für das Herunterladen über Nacht, das am Ende beschleunigt wurde, recht gut, da es am Ende sehr gute Schätzungen für die endgültige Fertigstellung liefert. Dies hat jedoch immer noch große Probleme. Es führt dazu, dass Ihre ETA stark abprallt, wenn sich Ihre Rate über einen kurzen Zeitraum schnell ändert, und Sie erhalten das "in 20 Sekunden erledigt, in 2 Stunden erledigt, in 2 Sekunden erledigt, in 30 erledigt." Minuten "schnelle Anzeige der Programmierschande.
Die eigentliche Frage:
Was ist der beste Weg, um eine geschätzte Zeit für die Fertigstellung einer Aufgabe zu berechnen, wenn man den zeitlichen Verlauf der Berechnung berücksichtigt? Ich suche keine Links zu GUI-Toolkits oder Qt-Bibliotheken. Ich frage nach dem Algorithmus , um die vernünftigsten und genauesten Schätzungen der Fertigstellungszeit zu generieren.
Haben Sie Erfolg mit mathematischen Formeln gehabt? Eine Art Mittelwertbildung, vielleicht unter Verwendung des Mittelwerts der Rate über 10 Sekunden mit der Rate über 1 Minute mit der Rate über 1 Stunde? Eine Art künstliche Filterung wie "Wenn meine neue Schätzung zu stark von der vorherigen Schätzung abweicht, verringern Sie sie, lassen Sie sie nicht zu stark abprallen"? Eine Art ausgefallene Verlaufsanalyse, bei der Sie den Fortschritt gegenüber dem Zeitfortschritt integrieren, um die Standardabweichung der Rate zu ermitteln und nach Abschluss statistische Fehlermetriken zu erhalten?
Was haben Sie versucht und was funktioniert am besten?