Na pierwszy rzut oka wydaje się, że generowanie dokładnej oceny czasu powinno być dość łatwe. W końcu algorytm generujący pasek postępu zna wszystkie zadania, które musi wykonać z wyprzedzeniem ... prawda?
W większości przypadków prawdą jest, że algorytm źródłowy wie, co należy zrobić z wyprzedzeniem. Jednak ustalenie czasu potrzebnego na wykonanie każdego kroku jest bardzo trudne, jeśli nie wręcz niemożliwe.
Najprostszym sposobem zaimplementowania paska postępu jest użycie graficznej reprezentacji licznika zadań. Gdzie procent ukończony jest po prostu obliczany jako Zakończone zadania / całkowita liczba zadań. Chociaż jest to logiczne w pierwszej chwili, ważne jest, aby pamiętać, że (oczywiście) niektóre zadania wymagają więcej czasu.
Rozważ następujące zadania wykonywane przez instalatora:
W tym przykładzie kroki 1, 3 i 4 zakończyłyby się bardzo szybko, natomiast krok 2 zajęłby trochę czasu. Tak więc pasek postępu pracujący na prostej liczbie szybko przeskoczyłby do 25%, zatrzymał się na chwilę, podczas gdy krok 2 działał, a następnie prawie natychmiast przeskoczył do 100%.
Tego typu implementacja jest dość powszechna wśród pasków postępu, ponieważ, jak wspomniano powyżej, jest łatwa do wdrożenia. Jednak, jak widać, jest on obciążony nieproporcjonalnymi zadaniami rzeczywisty procent postępu w odniesieniu do pozostałego czasu.
Aby obejść ten problem, niektóre paski postępu mogą wykorzystywać implementacje, w których etapy są ważone. Rozważ powyższe kroki, w których względna waga jest przypisana do każdego kroku:
Przy użyciu tej metody pasek postępu przesuwałby się o 10% w krokach (całkowita waga to 10), a kroki 1, 3 i 4 przesuwały pasek o 10% po zakończeniu, a krok 2 o przesunięcie o 70%. Chociaż z pewnością nie są doskonałe, takie metody są prostym sposobem dodania nieco większej dokładności do procentowego paska postępu.
Rozważ prosty przykład, w którym prosiłbym cię o policzenie do 50, podczas gdy ja korzystam ze stopera, żeby cię porwać. Powiedzmy, że liczyć do 25 na 10 sekund. Rozsądnie byłoby założyć, że pozostałe liczby zostaną policzone w ciągu dodatkowych 10 sekund, więc śledzenie paska postępu wskazywałoby 50% czasu z pozostałymi 10 sekundami.
Kiedy jednak liczba osiągnie 25, zacznę rzucać na ciebie piłką tenisową. Prawdopodobnie złamie to twój rytm, gdy twoja koncentracja przeniosła się od ścisłego liczenia liczb do uniku kulek rzucanych na twoją drogę. Zakładając, że jesteś w stanie kontynuować liczenie, twoje tempo z pewnością nieco zwolniło. Teraz pasek postępu wciąż się porusza, ale w znacznie wolniejszym tempie, z szacowanym czasem pozostawania w stanie spoczynku lub wspinaniem się wyżej.
Aby uzyskać bardziej praktyczny przykład, rozważ pobranie pliku. Aktualnie pobierasz plik 100 MB z szybkością 1 MB / s. Jest to bardzo łatwe do określenia szacowany czas ukończenia. Ale 75% drogi tam, niektóre przeciążenia sieci trafiają, a współczynnik pobierania spada do 500 KB / s.
W zależności od tego, w jaki sposób przeglądarka oblicza pozostały czas, ETA może natychmiast przejść od 25 sekund do 50 sekund (tylko przy użyciu aktualnego stanu: Rozmiar Pozostały / Prędkość pobierania) lub, najprawdopodobniej, przeglądarka używa algorytmu średniej kroczącej, który dostosowałby się do fluktuacji prędkości transferu bez wyświetlania dramatycznego skoku dla użytkownika.
Przykład toczącego się algorytmu pobierania pliku może działać w następujący sposób:
Używając powyższego scenariusza (dla uproszczenia użyjemy 1 MB = 1000 KB):
Możesz zobaczyć wzorzec pojawiający się tutaj, ponieważ spadek prędkości pobierania powoli włącza się do średniej, która jest używana do oszacowania pozostałego czasu. Zgodnie z tą metodą, jeśli spadek trwał tylko 10 sekund, a następnie powrócił do 1 MB / s, użytkownik prawdopodobnie nie zauważy różnicy (z wyjątkiem bardzo niewielkiego przeciągnięcia w przewidywanym odliczaniu czasu).
Dotarcie do pinezek mosiężnych - jest to po prostu metodologia przekazywania informacji do użytkownika końcowego dla rzeczywistej przyczyny ...
Ostatecznie niedokładność paska postępu sprowadza się do faktu, że próbuje ustalić czas dla czegoś, co jest niedeterministyczne.Ponieważ komputery przetwarzają zadania zarówno na żądanie, jak i w tle, prawie niemożliwe jest wiedzieć, jakie zasoby systemowe będą dostępne w dowolnym momencie w przyszłości - a dostępność zasobów systemowych jest potrzebna do wykonania każdego zadania.
Za pomocą innego przykładu załóżmy, że przeprowadzasz aktualizację programu na serwerze, który wykonuje dość intensywną aktualizację bazy danych. Podczas tego procesu aktualizacji użytkownik wysyła żądane żądanie do innej bazy danych uruchomionej w tym systemie. Teraz zasoby serwera, w szczególności dla bazy danych, muszą przetwarzać żądania zarówno dla aktualizacji, jak i dla zapytania inicjowanego przez użytkownika - scenariusz, który z pewnością będzie szkodliwy dla czasu wykonania. Alternatywnie, użytkownik może zainicjować duże żądanie przesyłania plików, które będzie opodatkowało przepustowość pamięci masowej, co również pogorszyłoby wydajność. Lub zaplanowane zadanie może zostać uruchomione, co powoduje intensywny proces pamięci. Masz pomysł.
Być może bardziej realistyczną instancją dla zwykłego użytkownika - rozważ uruchomienie Windows Update lub skanowanie antywirusowe. Obie te operacje wykonują intensywne operacje w tle. W rezultacie każdy postęp zależy od tego, co robi użytkownik w danym momencie. Jeśli czytasz e-mail, gdy to działa, najprawdopodobniej zapotrzebowanie na zasoby systemowe będzie niskie, a pasek postępu będzie konsekwentnie poruszać się. Z drugiej strony, jeśli robisz edycję grafiki, twoje zapotrzebowanie na zasoby systemowe będzie znacznie większe, co spowoduje, że ruch paska postępu będzie schizofreniczny.
Ogólnie rzecz biorąc, po prostu nie ma kryształowej kuli. Nawet sam system nie wie, jaki ładunek będzie znajdował się w jakimkolwiek punkcie w przyszłości.
Intencją paska postępu jest, no cóż, wskazanie, że rzeczywiście poczyniono postępy, a dany proces nie został zawieszony. Dobrze, gdy wskaźnik postępu jest dokładny, ale zazwyczaj jest to tylko niewielka irytacja, gdy nie jest. W przeważającej części deweloperzy nie poświęcą zbyt wiele czasu i wysiłku na algorytmy paska postępu, ponieważ, szczerze mówiąc, jest o wiele więcej ważnych zadań do spędzenia czasu.
Oczywiście masz wszelkie prawo do irytacji, gdy pasek postępu przeskoczy do 99% kompletnie od razu, a następnie sprawia, że czekamy 5 minut na pozostały jeden procent. Ale jeśli odpowiedni program działa dobrze, po prostu przypomnij sobie, że programista ma swoje priorytety prosto.