Ich habe einmal den besten Teil einer Woche damit verbracht, einen glatten, nicht schluckigen Fortschrittsbalken über einen sehr komplexen Algorithmus zu erstellen.
Der Algorithmus hatte 6 verschiedene Schritte. Jeder Schritt hatte Timing-Eigenschaften, die stark von A) der zugrundeliegenden Daten, die verarbeitet wurden, nicht nur die "Menge" der Daten, sondern auch die "Art" der Daten und B) 2 der Schritte extrem skaliert mit zunehmender Anzahl der CPUs, 2 Schritte wurden in 2 Threads ausgeführt und 2 Schritte waren effektiv single-threaded.
Die Mischung der Daten hatte einen viel größeren Einfluss auf die Ausführungszeit jedes Schritts als die Anzahl der Kerne.
Die Lösung, die es schließlich geknackt hat, war wirklich ziemlich einfach. Ich machte 6 Funktionen, die den Datensatz analysierten und versuchten, die tatsächliche Laufzeit jedes Analyseschritts vorherzusagen. Die Heuristik in jeder Funktion analysierte sowohl die analysierten Datensätze als auch die Anzahl der CPUs. Basierend auf Laufzeitdaten von meinem eigenen 4-Kern-Rechner gab jede Funktion im Grunde die Anzahl der Millisekunden zurück, die sie voraussichtlich hatte, auf meinem Rechner.
f1 (..) + f2 (..) + f3 (..) + f4 (..) + f5 (..) + f6 (..) = Gesamtlaufzeit in Millisekunden
nun gegeben Mit dieser Information können Sie effektiv wissen, wie viel Prozent der gesamten Ausführungszeit für jeden Schritt benötigt wird. Wenn Sie nun sagen, dass Schritt1 40% der Ausführungszeit benötigt, müssen Sie im Grunde herausfinden, wie 40 1% -Ereignisse von diesem Algorithmus ausgegeben werden.Sprich die for-Schleife 100.000 Artikel verarbeitet, könnten Sie wahrscheinlich tun:
for (int i = 0; i < numItems; i++){
if (i % (numItems/percentageOfTotalForThisStep) == 0) emitProgressEvent();
.. do the actual processing ..
}
Dieser Algorithmus uns eine seidig glatte Fortschrittsbalken gab, die einwandfrei durchgeführt wird. Ihre Implementierungstechnologie kann verschiedene Formen der Skalierung und Funktionen in der Fortschrittsleiste haben, aber die grundlegende Art, über das Problem nachzudenken, ist die gleiche.
Und ja, es war nicht wirklich wichtig, dass die Heuristik-Referenznummern auf meinem Rechner ausgearbeitet wurden - das einzige wirkliche Problem ist, wenn Sie die Zahlen ändern wollen, wenn sie auf einem anderen Rechner laufen. Aber du kennst immer noch das Verhältnis (das ist die einzige wirklich wichtige Sache hier), also kannst du sehen, wie deine lokale Hardware anders läuft als die, die ich hatte.
Jetzt kann sich der durchschnittliche SO-Leser fragen, warum in aller Welt jemand eine Woche damit verbringen würde, einen reibungslosen Fortschritt zu machen. Das Feature wurde vom Chefverkäufer angefordert, und ich glaube, er hat es in Verkaufsmeetings benutzt, um Verträge zu bekommen. Money Talks;)
Upvoted für die Coolness. – erikprice