Защо баровете за напредък са толкова неточни?
На пръв поглед изглежда, че генерирането на точна оценка на времето трябва да бъде доста лесно. В края на краищата, алгоритъмът, който произвежда лентата за напредък, знае всички задачи, които трябва да изпълни преди време… правилно?
В по-голямата си част е вярно, че алгоритъмът на източника знае какво трябва да направи преди време. Въпреки това, ограничаването на времето, необходимо за извършването на всяка стъпка, е много трудна, ако не и практически невъзможна задача.
Всички задачи не са създадени еднакви
Най-простият начин за реализиране на лента за напредък е да се използва графично представяне на брояч на задачи. Където процентът завършен е просто изчислен като Завършени задачи / Общ брой задачи. Въпреки че това прави логически смисъл на първо мислене, важно е да се помни, че (очевидно) някои задачи отнемат повече време за завършване.
Разгледайте следните задачи, изпълнявани от инсталатора:
- Създайте структура на папките.
- Декомпресирайте и копирайте файлове на стойност 1 GB.
- Създайте записи в регистъра.
- Създайте записи в стартовото меню.
В този пример стъпки 1, 3 и 4 ще се изпълнят много бързо, докато стъпка 2 ще отнеме известно време. Така че лентата на напредъка, работеща върху едно просто число, ще скочи до 25% много бързо, ще закъсне за малко, докато стъпка 2 работи, и след това скочи до 100% почти веднага.
Този тип внедряване всъщност е доста често срещано явление при напредъка, тъй като, както е посочено по-горе, той е лесен за изпълнение. Както виждате обаче, то е обект на непропорционални задачи, които изкривяват действителен процент на напредък, тъй като се отнася до оставащото време.
За да заобиколите това, някои барове за напредък могат да използват реализации, където стъпките са претеглени. Помислете за стъпките по-горе, където е присвоено относително тегло на всяка стъпка:
- Създайте структура на папките. [Тегло = 1]
- Декомпресирайте и копирайте файлове на стойност 1 GB. [Тегло = 7]
- Създайте записи в регистъра. [Тегло = 1]
- Създайте записи в стартовото меню. [Тегло = 1]
Използвайки този метод, лентата на прогреса ще се придвижва на стъпки от 10% (като общото тегло е 10) със стъпки 1, 3 и 4, движещи лентата с 10% при завършване и стъпка 2, която я движи със 70%. Макар със сигурност да не са перфектни, методи като този са лесен начин да добавите малко повече точност към процента на прогрес бар.
Минали резултати не гарантират бъдещи резултати
Обмислете един прост пример за мен, който ви моля да преброите до 50, докато използвам хронометъра, за да ви накарам да ви отразя. Да кажем, че броите до 25 за 10 секунди. Би било разумно да предположим, че ще преброите оставащите числа за допълнителни 10 секунди, така че проследяването на лентата за напредък ще показва 50% завършване с оставащите 10 секунди.
След като броят ви достигне 25, започвам да ви хвърлям топки за тенис. Вероятно това ще наруши ритъма ви, тъй като концентрацията ви се премести от строго преброяване на числа до избягващи топки, хвърлени по пътя ви. Ако приемем, че можеш да продължиш да броиш, темпото ти определено се забави малко. Така че сега лентата за напредък все още се движи, но с много по-бавни темпове, като очакваното време остава или в застой, или всъщност изкачване по-високо.
За по-практичен пример за това разгледайте изтеглянето на файл. В момента изтегляте 100 MB файл в размер на 1 MB / s. Това е много лесно да се определи очакваното време на завършване. Но 75% от пътя там, някои мрежови задръствания удари и си скорост на изтегляне пада до 500 KB / s.
В зависимост от това, как браузърът изчислява оставащото време, вашето ETA може незабавно да премине от 25 секунди на 50 секунди (използвайки само текущото състояние: Размер Оставащ / Скорост на изтегляне) или, най-вероятно, браузърът използва алгоритъм с подвижен среден коефициент, който ще се приспособи към колебанията в скоростта на трансфер без показване на драматични скокове към потребителя.
Пример за алгоритъм за преместване по отношение на изтеглянето на файл може да работи по следния начин:
- Скоростта на прехвърляне за предходните 60 секунди се запомня с най-новата стойност, заместваща най-старата (напр. 61-та стойност замества първата).
- Ефективната скорост на прехвърляне за целите на изчислението е средната стойност на тези измервания.
- Оставащото време се изчислява като: Оставащ размер / ефективна скорост на изтегляне
Така че използвайки нашия сценарий по-горе (за по-голяма простота ще използваме 1 MB = 1000 KB):
- При 75 секунди след изтеглянето ни, 60 запаметени стойности ще бъдат по 1000 KB. Ефективната скорост на трансфер е 1000 KB (60 000 KB / 60), което води до оставащо време от 25 секунди (25 000 KB / 1,000 KB).
- На 76 секунди (когато скоростта на прехвърляне спадне до 500 KB), ефективната скорост на изтегляне става ~ 992 KB (59,500 KB / 60), което води до оставащо време от ~ 24,7 секунди (24,500 KB / 992 KB).
- На 77 секунди: ефективна скорост = ~ 983 KB (59 000 KB / 60), което дава време, което остава ~ 24,4 секунди (24 000 KB / 983 KB).
- На 78 секунди: ефективна скорост = 975 KB (58,500 KB / 60), което дава оставащо време от ~ 24,1 секунди (23,500 KB / 975 KB).
Можете да видите модела, който се появява тук, тъй като потапянето в скоростта на изтегляне бавно се включва в средната стойност, която се използва за оценка на оставащото време. При този метод, ако потапянето продължава само 10 секунди и след това се връща на 1 МБ / сек, е малко вероятно потребителят да забележи разликата (освен за много малък срив в изчисленото време за обратно броене).
Как да стигнем до месинга - това е просто методология за предаване на информация до крайния потребител за действителната причина…
Не можете да определите точно нещо, което е недетерминирано
В крайна сметка неточността на лентата за напредък се свежда до факта, че тя се опитва да определи време за нещо, което е недетерминирано. Тъй като компютрите обработват задачи както по заявка, така и във фонов режим, е почти невъзможно да се знае какви системни ресурси ще бъдат на разположение във всеки един момент в бъдеще - и наличността на системни ресурси е необходима, за да се изпълни всяка задача.
Предполагам, че използвате друг пример, ако изпълнявате надстройка на програма на сървър, който изпълнява доста интензивна актуализация на базата данни. По време на този процес на обновяване, потребителят изпраща искане към друга база данни, работеща на тази система. Сега ресурсите на сървъра, специално за базата данни, се налага да обработват заявки както за вашето ъпгрейд, така и за потребителската заявка - сценарий, който със сигурност ще бъде взаимно пагубен за времето за изпълнение. Алтернативно, потребителят би могъл да инициира искане за прехвърляне на големи файлове, което би обложило пропускателната способност за съхранение, което също би отклонило производителността. Или може да започне планирана задача, която изпълнява процес на интензивна памет. Получаваш идеята.
Може би по-реалистичен пример за всекидневен потребител - помислете как да стартирате Windows Update или вирус. И двете операции изпълняват ресурсоемки операции във фонов режим. В резултат на това, напредъкът, който прави всеки, зависи от това, което потребителят прави по това време. Ако четете електронната си поща, докато се изпълнява, най-вероятно търсенето на системни ресурси ще бъде ниско и лентата за напредък ще се движи последователно. От друга страна, ако правите графично редактиране, търсенето на системни ресурси ще бъде много по-голямо, което ще предизвика движението на лентата за напредък да бъде шизофренно.
Като цяло, просто няма кристална топка. Дори и самата система не знае какъв товар ще бъде под каквато и да е точка в бъдеще.
В крайна сметка, това наистина не е от значение
Целта на лентата за напредък е да се отбележи, че наистина се постига напредък и съответният процес не е окачен. Хубаво е, когато индикаторът за напредъка е точен, но обикновено това е само незначително раздразнение, когато не е така. В по-голямата си част, разработчиците няма да посвещават много време и усилия на алгоритмите на лентата за напредък, защото, честно казано, има много по-важни задачи за прекарване на времето.
Разбира се, имате право да се дразните, когато лентата за напредък скочи до 99% завърши веднага и след това ви чака 5 минути за останалите един процент. Но ако съответната програма работи добре като цяло, просто си напомнете, че разработчиците са имали приоритети.