Miksi edistymispalkit ovat niin virheellisiä?
Ensimmäisen ajattelun mukaan näyttää siltä, että ajan tarkan arvioinnin tuottaminen olisi melko helppoa. Joka tapauksessa edistyspalkkia tuottava algoritmi tuntee kaikki tehtävät, joita se tarvitsee tehdä etukäteen… oikein?
Useimmiten on totta, että lähdealgoritmi tietää, mitä se tarvitsee tehdä etukäteen. Kunkin askeleen suorittamiseen kuluva aika on kuitenkin erittäin vaikeaa, joskaan ei käytännössä mahdotonta.
Kaikki tehtävät eivät ole yhtäläisiä
Yksinkertaisin tapa toteuttaa etenemispalkki on tehtävälaskurin graafinen esitys. Kun prosenttiosuus on laskettu yksinkertaisesti Valmiit tehtävät / Tehtävien kokonaismäärä. Vaikka tämä on loogista järkeä ensimmäisessä ajatuksessa, on tärkeää muistaa, että (tietysti) jotkin tehtävät kestävät kauemmin.
Harkitse seuraavia asentajan suorittamia tehtäviä:
- Luo kansiorakenne.
- Pura ja kopioi 1 Gt: n arvoinen tiedosto.
- Luo rekisterimerkintöjä.
- Luo aloitusvalikon merkinnät.
Tässä esimerkissä vaiheet 1, 3 ja 4 päättyisivät hyvin nopeasti, kun vaihe 2 vie jonkin aikaa. Niinpä yksinkertaisella laskulla työskentelevä etenemispalkki hyppää 25 prosenttiin hyvin nopeasti, pysähtyy hieman, kun vaihe 2 toimii, ja sitten hypätä 100 prosenttiin lähes välittömästi.
Tämäntyyppinen toteutus on oikeastaan melko yleistä edistyspalkkien keskuudessa, koska, kuten edellä todettiin, se on helppo toteuttaa. Kuten näette, se on kuitenkin suhteettoman suuri tehtävä todellinen edistymisprosentti, kun se koskee jäljellä olevaa aikaa.
Tämän kiertämiseksi jotkin etenemispalkit voivat käyttää toteutuksia, joissa vaiheet painotetaan. Harkitse edellä olevia vaiheita, joissa suhteellinen paino on määritetty jokaiselle vaiheelle:
- Luo kansiorakenne. [Paino = 1]
- Pura ja kopioi 1 Gt: n arvoinen tiedosto. [Paino = 7]
- Luo rekisterimerkintöjä. [Paino = 1]
- Luo aloitusvalikon merkinnät. [Paino = 1]
Tätä menetelmää käyttäen etenemispalkki siirtyisi 10%: n välein (kun kokonaispaino on 10) vaiheilla 1, 3 ja 4 siirtämällä palkkia 10% loppuun ja vaihe 2 siirtämällä sen 70%. Vaikka tällaiset menetelmät eivät todellakaan ole täydellisiä, ne ovat yksinkertainen tapa lisätä hieman enemmän tarkkuutta edistymispalkin prosenttiosuuteen.
Aiemmat tulokset eivät takaa tulevaa suorituskykyä
Harkitse yksinkertaista esimerkkiä, jossa pyydän sinua laskemaan 50: een, kun käytän ajanottokelloa. Oletetaan, että lasket 25: een 10 sekunnissa. Olisi järkevää olettaa, että lasket jäljellä olevat numerot 10 sekunnin kuluessa, joten etenemispalkin seuranta osoittaisi 50% loppuun 10 sekunnin kuluttua.
Kun olet laskenut 25: een, aloin heittää tennistä palloja. Todennäköisesti tämä rikkoo rytmiäsi, koska keskittymäsi on siirtynyt tiukasti laskevista numeroista väistyviin palloihin. Olettaen, että voit jatkaa laskemista, vauhti on varmasti hidastunut hieman. Nyt etenemispalkki liikkuu edelleen, mutta paljon hitaammin, kun arvioitu aika pysyy joko pysähdyksissä tai nousee korkeammalle.
Saat käytännön esimerkin tästä harkita tiedoston lataamista. Tällä hetkellä lataat 100 Mt: n tiedoston nopeudella 1 MB / s. Tämä on erittäin helppo määrittää arvioidun valmistumisajan. Mutta 75% täältä, jotkin verkon ruuhkat osuvat ja latausnopeus laskee 500 KB / s.
Riippuen siitä, miten selain laskee jäljellä olevan ajan, ETA voi heti siirtyä 25 sekunnista 50 sekuntiin (vain nykyisessä tilassa: Koko jäljellä / latausnopeus) tai todennäköisimmin selain käyttää liikkuvan keskiarvon algoritmia, joka säätää siirtonopeuden vaihteluita näyttämättä dramaattisia hyppyjä käyttäjälle.
Esimerkki liikkuvan algoritmin käyttämisestä tiedoston lataamiseen saattaa toimia näin:
- Edellisen 60 sekunnin siirtonopeus muistetaan uusimmalla arvolla, joka korvaa vanhin (esim. 61. arvo korvaa ensimmäisen).
- Tehokas siirtonopeus laskennassa on näiden mittausten keskiarvo.
- Jäljellä oleva aika lasketaan seuraavasti: Koko jäljellä / tehokas latausnopeus
Joten käytämme yllä olevaa skenaariota (yksinkertaisuuden vuoksi käytämme 1 MB = 1 000 KB):
- 60 sekunnin kuluttua latauksesta 60 muistaa arvoa olisivat kukin 1 000 KB. Tehokas siirtonopeus on 1 000 KB (60 000 KB / 60), joka tuottaa 25 sekunnin jäljellä olevan ajan (25 000 KB / 1000 KB).
- 76 sekunnissa (jos siirtonopeus putoaa 500 kB: iin) tehokas latausnopeus tulee ~ 992 KB (59,500 KB / 60), joka tuottaa jäljellä olevan ajan noin 24,7 sekuntia (24 500 KB / 992 KB).
- 77 sekunnissa: tehokas nopeus = ~ 983 KB (59 000 KB / 60), joka tuottaa jäljellä olevan ajan noin 24,4 sekuntia (24 000 KB / 983 KB).
- Klo 78 sekuntia: Tehollinen nopeus = 975 KB (58,500 KB / 60), joka tuottaa jäljellä olevan ajan noin 24,1 sekuntia (23 500 KB / 975 KB).
Näet täällä näkyvän kuvion, kun latausnopeuden laskeminen sisällytetään hitaasti keskiarvoon, jota käytetään jäljellä olevan ajan arvioimiseen. Tämän menetelmän mukaan, jos upotus kesti vain 10 sekuntia ja palasi sitten 1 MB / s: iin, käyttäjä ei todennäköisesti huomaa eroa (paitsi hyvin vähäiseen pysähtymiseen arvioidussa ajassa).
Pääsy messinkitappeihin - tämä on yksinkertaisesti menetelmä, jolla välitetään tietoja loppukäyttäjälle todellisesta taustalla olevasta syystä…
Et voi määritellä tarkasti jotain, joka ei ole määrittänyt
Viime kädessä etenemispalkin epätarkkuus heijastuu siihen tosiasiaan, että se yrittää määrittää ajan, joka ei ole mitätön. Koska tietokoneet käsittelevät tehtäviä sekä kysynnällä että taustalla, on lähes mahdotonta tietää, mitä järjestelmäresursseja on saatavilla milloin tahansa tulevaisuudessa - ja järjestelmän resurssien saatavuus on tarpeen, jotta kaikki tehtävät suoritetaan.
Oletetaan, että käytät toista esimerkkiä ohjelman päivityksessä palvelimella, joka suorittaa melko intensiivisen tietokannan päivityksen. Tämän päivitysprosessin aikana käyttäjä lähettää sitten vaativan pyynnön toiselle tietokannalle, joka toimii tässä järjestelmässä. Nyt palvelinresurssien, erityisesti tietokannan, on käsiteltävä sekä päivityksiä että käyttäjän aloittamaa kyselyä koskevat pyynnöt - skenaario, joka varmasti on haitallista toteutuksen ajaksi. Vaihtoehtoisesti käyttäjä voisi aloittaa suuren tiedostonsiirtopyynnön, joka verottaisi tallennuksen läpäisykyvyn, joka heikentäisi myös suorituskykyä. Tai ajoitettu tehtävä voi käynnistää muistin intensiivisen prosessin. Saat ajatuksen.
Kuten ehkä realistisempi esimerkki jokapäiväiselle käyttäjälle - harkitse Windows Update tai virustarkistus. Molemmat toiminnot suorittavat resurssitehokkaita toimintoja taustalla. Tämän seurauksena edistyminen, jonka kukin tekee, riippuu siitä, mitä käyttäjä tekee tuolloin. Jos luet sähköpostisi, kun tämä on käynnissä, järjestelmäresurssien kysyntä on todennäköisesti alhainen ja etenemispalkki liikkuu johdonmukaisesti. Toisaalta, jos teet grafiikan muokkausta, kysyntäsi järjestelmäresursseilla on paljon suurempi, mikä aiheuttaa etenemispalkin liikkeen skitsofreeniseksi.
Kaiken kaikkiaan on yksinkertaisesti, ettei kristallipalloa ole. Ei edes järjestelmä itse tiedä, mitä kuormaa se on milloin tahansa tulevaisuudessa.
Lopulta se ei todellakaan merkitse
Etenemispalkin tarkoitus on, hyvin, osoittaa, että edistystä on todellakin tapahtunut ja vastaavaa prosessia ei ole ripustettu. On mukavaa, kun edistymisindikaattori on tarkka, mutta tyypillisesti se on vain vähäinen ärsytys, kun se ei ole. Useimmiten kehittäjät eivät aio käyttää paljon aikaa ja vaivaa etenemispalkkialgoritmeihin, koska rehellisesti sanottuna on paljon tärkeämpiä tehtäviä aikaa viettää aikaa.
Tietenkin, sinulla on kaikki oikeus olla harmissaan, kun edistymispalkki hyppää 99%: iin välittömästi ja sitten odottaa 5 minuuttia jäljellä olevalle prosentille. Mutta jos kyseinen ohjelma toimii hyvin yleisesti, muistuta itseäsi siitä, että kehittäjällä oli suora prioriteetti.