Warum sind Fortschrittsbalken so ungenau? [geschlossen]

8

Computer und Programmiersprachen sind in der Regel deterministisch und vorhersehbar. Fortschrittsbalken scheinen jedoch das Gegenteil zu sein, insbesondere wenn die Operation komplex ist. Selbst bei professionellen Produkten von Weltklasse spiegeln einige Fortschrittsbalken kaum den tatsächlichen Fortschritt einer Operation wider. Ich habe gesehen, wie sie in einem Sprung von 10% auf 90% gestiegen sind, nachdem sie 4 Stunden lang nichts getan hatten. Ich habe sogar einige Rückschritte gesehen, die darauf hindeuten, dass eine zusätzliche unerwartete Verarbeitung entdeckt wurde.

Zugegeben, es kann Datenbankoperationen, Netzwerkverarbeitung und parallele Operationen geben, aber es scheint, dass dies auf irgendeine Weise quantifiziert und ein Prozentsatz geschätzt werden könnte. Schließlich muss eine begrenzte Anzahl von Anweisungen ausgeführt werden, um eine Operation abzuschließen. Ist dies einfach eine schlechte Codierung oder gibt es einen fundamentalen Grund, warum es schwierig ist, den Fortschritt darzustellen?

Paul Uszak
quelle
1
Das hat nichts mit Computern zu tun Wissenschaft .
Raphael
1
Ich habe versucht, es in meiner Antwort einem wissenschaftlichen Rahmen näher zu bringen. Ach.
André Souza Lemos
@ Raphael Offensichtlich unterscheiden sich die 5 Leser, die Antworten gepostet haben, von Ihrer Meinung. Es geht nicht um Dampflokomotive, oder?
Paul Uszak
Nein, es geht um Fehler im UI-Design. Welches ist offtopic. Möglicherweise gibt es dort Informatikfragen, aber nicht in der aktuellen Form. (Beachten Sie, dass Ihre Annahme subtil fehlerhaft ist. Während die Real Computer sind vorhersehbar, streng genommen, die Berechnung einer Vorhersage im Allgemeinen ist nicht billiger als die Berechnung selbst. Auch wer die Vorhersage- hat? Anwendungen keine Kontrolle über die Maschine, so dass jede Vorhersage ist vorausgesetzt, ich gehe davon aus, dass "ich so viele Ressourcen bekomme, wie ich bekommen habe" - überhaupt keine solide Annahme!)
Raphael

Antworten:

2

Um die bisher allgemeineren Antworten zu ergänzen, kann ich einige Beispiele aus meinem Bereich nennen, in denen Fortschrittsbalken nicht funktionieren und warum;

Computergestützte Konstruktionsprogramme - Programme, die thermische Analysen oder Strömungsmechaniken durchführen, können mit Fortschrittsbalken im Allgemeinen schrecklich sein. Sie springen vorwärts, rückwärts, machen inkonsistente Schritte und es hat fast keinen Sinn, sie zu beobachten. Dies ist auf den iterativen Charakter dieser Arten von Simulationen und die Notwendigkeit zurückzuführen, Konvergenz zu finden. Dies lässt sich am besten nicht anhand eines Fortschrittsbalkens, sondern anhand eines Iterations-Konvergenz-Diagramms anzeigen.

Komplexe Simulationen - Ich habe ein Programm geschrieben, das eine komplexe Umgebung mit vielen miteinander verbundenen Faktoren simuliert. Es war für eine feste Zeitachse, also würde der Fortschrittsbalken genau die richtige Zeit sein? In meinem Fall ist die Simulation mit jedem neuen Zeitschritt zu lang, was bedeutet, dass der Fortschrittsbalken immer langsamer wird - nicht großartig. Ich fand eine andere Metrik für die Dauer der durchschnittlichen Simulation, basierend auf der Anzahl der Elemente in der Simulation, die näher an der Genauigkeit lag - aber nicht ideal, da die Prozessleiste manchmal nie gefüllt wurde (Simulation wurde zuvor gestoppt) oder 100% zu früh erreichte (Simulation lief) länger als erwartet).

In beiden Fällen wäre es entweder unmöglich, das Maximum für einen reinen Fortschrittsbalken vorher zu berechnen (Fall 1) oder nicht linear und daher nicht sehr nützlich (Fall 2).

user6916458
quelle
1
Vielen Dank für Ihre Antwort. Ich möchte Sie dazu ermutigen, zuerst zu prüfen, ob die Frage zum Thema gehört.
Böse
@ Evil leider hatte die mobile Version von SO nicht aktualisiert, dass die Frage als nicht zum Thema gewählt wurde, als ich diese Antwort schrieb.
user6916458
3

Beide. Manchmal ist es nur schwer abzuschätzen, wie viel Zeit eine Operation in Anspruch nehmen wird, da Sie nicht im Voraus wissen, wie viel Arbeit erledigt werden muss. Manchmal sind es vereinfachte und ungenaue Schätzungen.

Beispiel: Ich lade vier Dateien gleichzeitig herunter. Jemand weiß, wie groß jede Datei ist, wie viel heruntergeladen wurde und wie viele Megabyte pro Sekunde für jede Datei heruntergeladen wurden. Scheint leicht vorherzusagen, wie lange es dauern wird. Ich weiß jedoch, dass nach dem Herunterladen einer Datei die anderen schneller heruntergeladen werden. Noch mehr, nachdem 3 Dateien heruntergeladen wurden. Der letzte wird viermal schneller heruntergeladen. Ich habe noch nie einen Fortschrittsbalken gesehen, der dies berücksichtigt.

Beispiel: Sie kopieren einen großen Ordner. In der Fortschrittsanzeige wird davon ausgegangen, dass Sie X Megabyte pro Sekunde kopieren, wissen, wie viele Megabyte vorhanden sind und wie schnell Sie bisher durchschnittlich waren. Das Problem ist, dass "Megabyte pro Sekunde" sehr ungenau ist - in der Praxis dauert es x Millisekunden pro Datei plus y Millisekunden pro Megabyte. Viele kleine Dateien dauern also viel länger als der Fortschrittsbalken erwartet.

Das Problem ist, dass Softwareentwickler sich vielleicht darum kümmern, aber ihre Manager nicht, solange Ihr Computer nicht abstürzt.

gnasher729
quelle
3

Ich denke, die übergeordnete Antwort ist, dass es oft zu komplex (oder unmöglich) ist, die Zeit zu berechnen, die dafür benötigt wird.

Manchmal ist es nur eine Frage der Rechenzeit, um den Arbeitsaufwand besser abzuschätzen (z. B. eine bessere Analyse der zu kopierenden Dateien oder eine komplexere Berechnung, um die Anzahl der erforderlichen Schritte besser abzuschätzen) eine Simulation abschließen).

In anderen Fällen ist es ziemlich unbestimmt. Wenn Ihr System ein neues Programm installiert, müssen häufig viele Abhängigkeiten überprüft werden. Und im Allgemeinen hat es keine Ahnung, wie lange jeder einzelne dauern wird und welche Abhängigkeiten diese wiederum benötigen könnten. Möglicherweise sind bereits alle Abhängigkeiten installiert, und es kann 30 Sekunden dauern, oder es fehlen Ihnen Dutzende, und es dauert Stunden. Es ist schwer, einen fairen Hintergrund dafür zu finden, besonders wenn jede Situation einzigartig sein wird.

Darüber hinaus können sich andere Abflüsse im System im Laufe der Zeit ändern (aufgrund dessen, was der Benutzer tut ... oder aufgrund von Hintergrund- / geplanten Prozessen).

Manchmal könnte die Schätzung verbessert werden, wenn der Programmierer etwas mehr Arbeit in sie stecken würde. Aber dann ist es eine andere Realität, dass dies wahrscheinlich nicht das Hauptanliegen der meisten Entwickler ist, verglichen mit der Förderung der tatsächlichen produktiven Aufgaben, die die Anwendung ausführen kann.

Letztendlich glaube ich, dass es im Moment oft nur eine lineare Schätzung ist - ein Blick darauf, wie viele der erforderlichen Grundaufgaben das Programm abgeschlossen hat. Es handelt sich also in der Tat um eine sehr grobe Schätzung, und Sie sollten sie im Allgemeinen als solche betrachten.


Eine gute Analogie könnte sein, wenn Sie ein Buch lesen.
Und Sie entscheiden, dass Sie eine Vorstellung davon haben möchten, wie lange es dauern wird, bis das Buch fertig ist ...
Sie können die Seitenzahl überprüfen und eine schnelle Schätzung basierend auf dem bisherigen Tempo erhalten.
Es könnte eine schlechte Schätzung sein, wenn Sie gerade mit dem Lesen begonnen haben, da Ihre Geschwindigkeit möglicherweise noch nicht typisch ist. Aber oft wäre es eine ziemlich grobe Vermutung.
Sie können das Buch auch überfliegen und sich eine ungefähre Vorstellung davon machen, wie viele Bilder es gibt und wie groß der Textabstand ist. Und dann haben Sie eine bessere Vorstellung davon, was Sie sehen.
Es kann jedoch immer noch eine schlechte Schätzung sein, wenn beispielsweise die Lesbarkeit des Textes abnimmt und möglicherweise von einer einfachen zu einer komplexen Prosa übergeht. Oder die Schätzung ist möglicherweise falsch, weil Sie keine andere Aufgabe erwartet haben, die Ihre Aufmerksamkeit ablenkt.
Sie könnten eine gute Schätzung erhalten, indem Sie einen großen Teil der Zeit verwenden, um sorgfältig zu analysieren, was Seite für Seite im Buch verbleibt, und es ebenfalls verbessern, indem Sie Ihren Kalender überprüfen und eine Liste der langfristigen Leseschritte für verschiedene Bücher führen.
Aber ist die Zeit, die dafür benötigt wird, die Verzögerung wert, nur um das Buch zu lesen?


Wir alle würden bessere Indikatoren lieben. Aber so wie es ist, werden wir wahrscheinlich mit groben Schätzungen rechnen müssen, zumindest bis Computer als Ganzes beginnen, verbesserte standardisierte Algorithmen zu erhalten und in der Lage sind, dynamische Faktoren (wie Ihre Wege) "intelligent" abzuwägen und zu antizipieren!

Und der Fortschrittsbalken dafür liegt momentan vielleicht bei 5%. Wir müssen nur sehen, wie das geht 8-)

JeopardyTempest
quelle
1
Vielen Dank für Ihre Antwort. Ich möchte Sie dazu ermutigen, vor der Beantwortung zu prüfen, ob die Frage zum Thema gehört.
Böse
Vielen Dank, dass Sie sich die Mühe gemacht haben, meine Frage so umfassend zu beantworten - ignorieren Sie einfach den obigen Kommentar von Dr. Evil.
Paul Uszak
1
Ihre Buchanalogie ist sowohl gut als auch schlecht. Ja, es ist wie beim Lesen eines Buches, aber vergessen Sie nicht, dass das Buch bereits gelesen wurde (von den Entwicklern). Es sollte möglich sein, eine Art Ausführungszuordnung, Meilensteinanweisungen oder abgeschlossene kritische Prozeduren zu erstellen und diese dann an den Benutzer zurückzugeben. Ich konzentriere mich auf kommerzielle Software, die ohnehin schon für Dinge wie Leistung getestet wurde. Wenn Sie die Betriebsleistung / Ressourcenzuweisung bewerten können, sollten Sie in der Lage sein, die Installationsleistung zu bewerten, wenn der Algorithmus zuvor ausgeführt wurde.
Paul Uszak
1

Ich möchte der Antwort von @ gnasher729 hinzufügen, dass dies eine weitere versteckte Folge der Unentscheidbarkeit des Stoppproblems ist.

Abgesehen von der inhärenten Unvorhersehbarkeit interaktiver Berechnungen können selbst isolierte Berechnungen eine Ausführungszeit (und einen "Rhythmus") aufweisen, deren Vorhersagbarkeit mit einer allgemeinen Methode nicht erreicht werden kann.

Leider ist ein Fortschrittsbalken oft eine nutzlose Metapher. Was wären die Alternativen, könnte man fragen. Wenn der Benutzer weiß, was "unter der Haube" vor sich geht, kann das Hinzufügen einiger semantischer Informationen zur Schnittstelle eine Option sein, um zu einer Trace-Modus-ähnlichen Ausführung überzugehen. Wenn nicht, schaffen Sie eine ruhige Atmosphäre, die die Erwartungen reduziert.

Den Benutzer über das Verständnis unserer Einschränkungen zu informieren, ist eine - langfristig - dritte Option.

André Souza Lemos
quelle
1
Ich muss eine Ausnahme von Ihrer Charakterisierung des Benutzers machen . Ein Benutzer aktualisiert möglicherweise die Oracle Enterprise Business Suite für eine Handelsbank, die nicht mit der Installation von Space Invaders vergleichbar ist. Das Anzeigen eines Fortschrittsbalkens dient nicht dazu, die Erwartungen zu verringern. aber um dem Projektteam eine Rückmeldung zu geben, wie lange das Handelssystem ausfallen wird. Und ich bin mir nicht sicher, ob dies ein Beispiel für das Problem des Anhaltens ist, da eine Bank möglicherweise kein Upgrade starten möchte, dessen Abschluss nicht garantiert ist ...
Paul Uszak
1
Ich sehe keinen Grund, warum dieses Phänomen im Allgemeinen jemals der Vollständigkeit von Turing zugeschrieben werden sollte. Viele Prozesse, die Fortschrittsbalken erfordern, sind endliche Sequenzen von definitiv beendenden Unterprozessen.
Rhymoid
1
Wie oft ein Unterprogramm ausgeführt werden muss, ist eine nicht triviale Eigenschaft der Ausführung eines Programms, die sich auf die geschätzte Fertigstellungszeit auswirkt. Der Satz von Rice zeigt, dass dies unentscheidbare Probleme sind, indem man sich auf das Stoppproblem reduziert. Konkret ist es aus praktischen Gründen normalerweise nicht möglich, das Verhalten eines Programms so detailliert zu modellieren, dass ein Fortschrittsbalken dem entspricht, was tatsächlich vor sich geht.
André Souza Lemos
@PaulUszak Wie oft haben wir hoffnungslos darauf gewartet, dass Programme (Upgrades, was auch immer) beendet werden? Menschen, Banken, Flugzeugpiloten, Regierungen ...?
André Souza Lemos
@ AndréSouzaLemos Das ist völlig nebensächlich. Dies ist eine Frage zu einer Beobachtung über die Praxis. In der Praxis ist die Häufigkeit, mit der das Unterprogramm ausgeführt werden muss, innerhalb einer engen Grenze bekannt, während die Zeit, die dafür aufgewendet werden muss, normalerweise nicht im Voraus bekannt ist, da sie von der E / A abhängt. Die Logik hinter den Fortschrittsbalken wird immer für eine bestimmte Anwendung erstellt und nicht durch Programmanalyse oder etwas anderes generiert, bei dem die Berechenbarkeitstheorie ihren Kopf erheben würde.
Rhymoid
1

Fortschrittsbalken werden basierend auf der Anzahl der abgeschlossenen Unteraufgaben und nicht auf der für die Fertigstellung verstrichenen / erforderlichen Zeit gezeichnet.

Angenommen, eine Operation X hat vier verschiedene Unterschritte. Am Ende jedes Schritts erhöhen Sie den Fortschrittsbalken um 25%. Wenn die Ausführung eines Schritts länger dauert, wird wahrscheinlich das von Ihnen beschriebene Verhalten angezeigt - 1 bis 90% auf einmal und Stunden für den Rest.

Die Logik hinter der Verwendung der Anzahl von Unteraufgaben als Einheit anstelle der Zeit besteht darin, dass letztere nicht vorhersehbar ist. Selbst beim Herunterladen einer Datei kann die Verbindung unterbrochen werden, sodass die Zeit nicht als Einheit verwendet werden kann. Sie möchten lieber die Anzahl der heruntergeladenen Bytes und nicht die erforderliche Zeit als Fortschrittseinheit verwenden.

Extreme Codierer
quelle
1
Vielen Dank für Ihre Antwort. Ich möchte Sie dazu ermutigen, zuerst zu prüfen, ob die Frage zum Thema gehört.
Böse