Warum sind Fortschrittsbalken so ungenau?
Auf den ersten Blick scheint es ziemlich einfach zu sein, eine genaue Zeitschätzung zu erstellen. Der Algorithmus, der den Fortschrittsbalken erzeugt, kennt alle Aufgaben, die er im Vorfeld erledigen muss ... richtig?
In den meisten Fällen weiß der Quellalgorithmus vorab, was er tun muss. Das Festlegen der Zeit, die für jeden Schritt erforderlich ist, ist jedoch eine sehr schwierige, wenn nicht sogar praktisch unlösbare Aufgabe.
Alle Aufgaben werden nicht gleich erstellt
Die einfachste Möglichkeit, eine Fortschrittsleiste zu implementieren, ist die grafische Darstellung des Taskzählers. Wo der Prozentanteil einfach berechnet wird als Abgeschlossene Aufgaben / Gesamtzahl der Aufgaben. Dies ist zwar auf den ersten Blick logisch sinnvoll, es ist jedoch wichtig zu bedenken, dass (offensichtlich) einige Aufgaben länger dauern.
Berücksichtigen Sie die folgenden Aufgaben, die von einem Installationsprogramm ausgeführt werden:
- Ordnerstruktur erstellen.
- Dekomprimieren und kopieren Sie Dateien im Wert von 1 GB.
- Registrierungseinträge erstellen.
- Erstellen Sie Startmenüeinträge.
In diesem Beispiel würden die Schritte 1, 3 und 4 sehr schnell abgeschlossen sein, während Schritt 2 einige Zeit in Anspruch nehmen würde. Ein Fortschrittsbalken, der mit einer einfachen Zählung arbeitet, springt also sehr schnell auf 25%, bleibt während der Ausführung von Schritt 2 eine Weile stehen und springt dann fast sofort auf 100%.
Diese Art der Implementierung ist unter Fortschrittsbalken durchaus üblich, da sie, wie oben erwähnt, einfach zu implementieren ist. Wie Sie jedoch sehen können, ist es mit unverhältnismäßigen Aufgaben verbunden, die das Programm verzerren tatsächlich Prozentsatz des Fortschritts in Bezug auf die verbleibende Zeit.
Einige Fortschrittsbalken verwenden möglicherweise Implementierungen, bei denen Schritte gewichtet werden. Betrachten Sie die obigen Schritte, bei denen jedem Schritt eine relative Gewichtung zugewiesen wird:
- Ordnerstruktur erstellen [Gewicht = 1]
- Dekomprimieren und kopieren Sie Dateien im Wert von 1 GB. [Gewicht = 7]
- Registrierungseinträge erstellen [Gewicht = 1]
- Erstellen Sie Startmenüeinträge. [Gewicht = 1]
Bei Verwendung dieser Methode würde sich der Fortschrittsbalken in Schritten von 10% bewegen (da das Gesamtgewicht 10 beträgt). Die Schritte 1, 3 und 4 würden den Balken nach Abschluss um 10% und den Schritt 2 um 70% verschieben. Obwohl dies sicherlich nicht perfekt ist, sind Methoden wie diese eine einfache Methode, um den Prozentsatz der Fortschrittsleiste etwas genauer zu gestalten.
Ergebnisse der Vergangenheit garantieren keine zukünftigen Leistungen
Stellen Sie sich ein einfaches Beispiel vor, in dem ich Sie bittet, bis 50 zu zählen, während ich Sie mit einer Stoppuhr steuere. Angenommen, Sie zählen in 10 Sekunden bis 25. Es ist vernünftig anzunehmen, dass Sie die verbleibenden Zahlen in weiteren 10 Sekunden zählen werden. Ein Fortschrittsbalken, der dies anzeigt, würde 50% anzeigen, während 10 Sekunden verbleiben.
Sobald Sie 25 erreicht haben, fange ich an, Tennisbälle auf Sie zu werfen. Wahrscheinlich bricht dies Ihren Rhythmus, da sich Ihre Konzentration von der strengen Zählweise hin zu den ausweichenden Bällen gewandelt hat. Vorausgesetzt, Sie können weiter zählen, hat sich Ihr Tempo sicherlich etwas verlangsamt. Der Fortschrittsbalken bewegt sich also immer noch, aber viel langsamer, wobei die geschätzte Zeit entweder im Stillstand bleibt oder tatsächlich höher steigt.
Ein praktischeres Beispiel hierfür ist ein Dateidownload. Sie laden derzeit eine 100 MB-Datei mit einer Geschwindigkeit von 1 MB / s herunter. Dies ist sehr einfach, um die voraussichtliche Fertigstellungszeit zu bestimmen. 75% des Weges dahin, einige Netzwerkstaus und Ihre Download-Rate sinkt auf 500 KB / s.
Je nachdem, wie der Browser die verbleibende Zeit berechnet, kann Ihre ETA sofort von 25 Sekunden auf 50 Sekunden gehen (nur im aktuellen Zustand: Restgröße / Downloadgeschwindigkeit) oder, höchstwahrscheinlich, verwendet der Browser einen Algorithmus für einen laufenden Durchschnitt, der sich an Schwankungen der Übertragungsgeschwindigkeit anpassen würde, ohne dem Benutzer dramatische Sprünge anzuzeigen.
Ein Beispiel für einen Rolling-Algorithmus in Bezug auf das Herunterladen einer Datei könnte in etwa folgendermaßen aussehen:
- Die Übertragungsgeschwindigkeit der letzten 60 Sekunden wird gespeichert, wobei der neueste Wert den ältesten ersetzt (z. B. ersetzt der 61. Wert den ersten)..
- Die effektive Übertragungsrate zum Zwecke der Berechnung ist der Durchschnitt dieser Messungen.
- Verbleibende Zeit wird berechnet als: Verbleibende / effektive Downloadgeschwindigkeit
Verwenden Sie also unser Szenario oben (zur Vereinfachung verwenden wir 1 MB = 1.000 KB):
- Bei 75 Sekunden nach dem Download wären unsere 60 gespeicherten Werte jeweils 1.000 KB. Die effektive Übertragungsrate beträgt 1.000 KB (60.000 KB / 60), was eine verbleibende Zeit von 25 Sekunden (25.000 KB / 1.000 KB) ergibt..
- Bei 76 Sekunden (wenn die Übertragungsgeschwindigkeit auf 500 KB sinkt) beträgt die effektive Downloadgeschwindigkeit ~ 992 KB (59.500 KB / 60), was eine verbleibende Zeit von ~ 24,7 Sekunden (24.500 KB / 992 KB) ergibt..
- Bei 77 Sekunden: effektive Geschwindigkeit = ~ 983 KB (59.000 KB / 60), wodurch eine verbleibende Zeit von ~ 24,4 Sekunden (24.000 KB / 983 KB) erzielt wird..
- Bei 78 Sekunden: effektive Geschwindigkeit = 975 KB (58.500 KB / 60), verbleibende Zeit von ~ 24,1 Sekunden (23.500 KB / 975 KB).
Sie können das Muster erkennen, das hier auftritt, da der Rückgang der Downloadgeschwindigkeit langsam in den Durchschnitt eingeht, der zur Abschätzung der verbleibenden Zeit verwendet wird. Wenn bei dieser Methode der Dip nur 10 Sekunden dauerte und dann wieder auf 1 MB / s zurückging, ist es unwahrscheinlich, dass der Benutzer den Unterschied bemerkt (außer bei einem sehr geringen Stillstand des geschätzten Zeit-Countdowns)..
An die Brass Tacks gelangen - dies ist einfach eine Methode, um dem Endbenutzer Informationen über die eigentliche Ursache zu vermitteln…
Sie können etwas, das nicht deterministisch ist, nicht genau bestimmen
Letztendlich läuft die Ungenauigkeit der Fortschrittsanzeige darauf hinaus, dass versucht wird, eine Zeit für etwas zu bestimmen, das nicht deterministisch ist. Da Computer Aufgaben sowohl auf Abruf als auch im Hintergrund verarbeiten, ist es fast unmöglich zu wissen, welche Systemressourcen zu einem beliebigen Zeitpunkt in der Zukunft verfügbar sein werden - und es ist die Verfügbarkeit von Systemressourcen, die für den Abschluss jeder Aufgabe erforderlich ist.
Angenommen, Sie führen ein Programmupgrade auf einem Server aus, der ein ziemlich intensives Datenbank-Update durchführt. Während dieses Aktualisierungsvorgangs sendet ein Benutzer eine anspruchsvolle Anforderung an eine andere Datenbank, die auf diesem System ausgeführt wird. Jetzt müssen die Serverressourcen speziell für die Datenbank Anforderungen sowohl für das Upgrade als auch für die vom Benutzer initiierte Abfrage verarbeiten - ein Szenario, das sich sicherlich gegenseitig nachteilig auf die Ausführungszeit auswirkt. Alternativ könnte ein Benutzer eine große Dateiübertragungsanforderung einleiten, die den Speicherdurchsatz besteuern würde, was ebenfalls die Leistung beeinträchtigen würde. Oder es kann eine geplante Task starten, die einen speicherintensiven Prozess durchführt. Du hast die Idee.
Als vielleicht realistischere Instanz für einen normalen Benutzer sollten Sie Windows Update oder einen Virenscan ausführen. Beide Operationen führen ressourcenintensive Operationen im Hintergrund durch. Infolgedessen hängt der jeweilige Fortschritt davon ab, was der Benutzer gerade tut. Wenn Sie Ihre E-Mail lesen, während diese läuft, ist der Bedarf an Systemressourcen wahrscheinlich gering und der Fortschrittsbalken wird konstant verschoben. Auf der anderen Seite ist der Bedarf an Systemressourcen bei der Bearbeitung von Grafiken viel höher, was dazu führt, dass die Fortschrittsbalkenbewegung schizophren wird.
Insgesamt gibt es einfach keine Kristallkugel. Nicht einmal das System selbst weiß, unter welcher Last es sich in Zukunft befinden wird.
Letztlich spielt es wirklich keine Rolle
Der Fortschrittsbalken hat die Absicht zu zeigen, dass tatsächlich Fortschritte gemacht werden und der jeweilige Prozess nicht blockiert ist. Es ist schön, wenn der Fortschrittsindikator genau ist, aber normalerweise ist es nur ein kleiner Ärger, wenn dies nicht der Fall ist. In der Regel werden Entwickler nicht viel Zeit und Mühe in die Fortschrittsbalkenalgorithmen investieren, denn ehrlich gesagt, es gibt viel wichtigere Aufgaben, für die Zeit aufgewendet werden muss.
Natürlich haben Sie jedes Recht, sich zu ärgern, wenn ein Fortschrittsbalken sofort zu 99% abgeschlossen wird und Sie dann 5 Minuten auf das verbleibende Prozent warten müssen. Wenn das jeweilige Programm jedoch insgesamt gut funktioniert, sollten Sie sich nur daran erinnern, dass der Entwickler seine Prioritäten direkt hatte.