Miksi Progress-palkit ovat niin epätarkkoja?

Sisällysluettelo:

Miksi Progress-palkit ovat niin epätarkkoja?
Miksi Progress-palkit ovat niin epätarkkoja?

Video: Miksi Progress-palkit ovat niin epätarkkoja?

Video: Miksi Progress-palkit ovat niin epätarkkoja?
Video: Мы потеряемся в метро ► 3 Прохождение Silent Hill 3 ( PS2 ) - YouTube 2024, Huhtikuu
Anonim
Aluksi ajateltiin, että tarkan aikataulun tuottaminen olisi melko helppoa. Loppujen lopuksi aloitusprosessia tuottava algoritmi tietää kaikki tehtävät, joita se tarvitsee tehdä etukäteen … eikö?
Aluksi ajateltiin, että tarkan aikataulun tuottaminen olisi melko helppoa. Loppujen lopuksi aloitusprosessia tuottava algoritmi tietää kaikki tehtävät, joita se tarvitsee tehdä etukäteen … eikö?

Useimmiten on totta, että lähdealgoritmi tietää, mitä se tarvitsee tehdä etukäteen. Kuitenkin, kun se kuluu jokaisen askeleen suorittamiseen, on erittäin vaikea, ellei lähes mahdoton tehtävä.

Kaikki tehtävät eivät ole tasavertaiset

Yksinkertaisin tapa toteuttaa edistymispalkki on käyttää graafista esitystä tehtävä laskuri. Jos täydellinen prosentti lasketaan yksinkertaisesti Tehtävät / Tehtävien kokonaismäärä. Vaikka tämä on järkevää ajattelutavalla, on tärkeää muistaa, että (tietysti) jotkut tehtävät kestävät kauemmin.

Harkitse seuraavat asennusohjelman suorittamat tehtävät:

  1. Luo kansion rakenne.
  2. Purkaa ja kopioi 1 Gt tiedostoja.
  3. Luo rekisterimerkintöjä.
  4. Luo aloitusvalikon merkinnät.

Tässä esimerkissä vaiheet 1, 3 ja 4 saataisiin hyvin nopeasti, kun vaihe 2 kestää jonkin aikaa. Joten yksinkertainen laskentataulukko hyppää 25%: iin 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 varsin yleinen edistymispalkkien välillä, koska, kuten yllä on todettu, se on helppo toteuttaa. Kuitenkin, kuten näette, siihen kohdistuu suhteettomia tehtäviä todellinen edistymisprosentti, kun se liittyy jäljellä olevaan aikaan.

Tämän ongelman ratkaisemiseksi jotkut etenemispalkit saattavat käyttää toteutuksia, joissa vaiheet painotetaan. Harkitse edellä kuvatut vaiheet, joissa jokaiselle vaiheelle annetaan suhteellinen paino:

  1. Luo kansion rakenne. [Paino = 1]
  2. Purkaa ja kopioi 1 Gt tiedostoja. [Paino = 7]
  3. Luo rekisterimerkintöjä. [Paino = 1]
  4. Luo aloitusvalikon merkinnät. [Paino = 1]

Tämän menetelmän avulla edistymispalkki siirtyisi 10%: n välein (kokonaispainon ollessa 10), vaiheet 1, 3 ja 4 siirtävät palkin 10% loppuun ja vaihe 2 liikuttaa sitä 70%. Vaikka varmasti ei ole täydellistä, tällaiset menetelmät ovat yksinkertainen tapa lisätä hieman tarkkuutta edistymispalkkiprosenttiin.

Aiemmat tulokset eivät takaa tulevaa suorituskykyä

Image
Image

Harkitse yksinkertaista esimerkkiä minulta, jossa pyydän laskemaan 50: a kun käytän sekuntikelloa aikaa. Oletetaan, että lasket 25 sekunnissa 10 sekunnissa. Olisi järkevää olettaa, että laski jäljellä olevat numerot vielä 10 sekunnissa, joten seurannan etenemispalkki näyttää 50% loppuun ja 10 sekuntia jäljellä.

Kun luotasi on 25, aloitan kuitenkin tennispallojen heittämisen. Todennäköisesti tämä rikkoo rytmiäsi, kun pitoisuutesi on siirtynyt tiukasti laskemasta numeroita väistelemään palloja, jotka heittäytyvät. Olettaen, että pystyt jatkamaan laskemista, vauhti on varmasti hidastunut hieman. Joten nyt etenemispalkki on edelleen liikkuva, mutta paljon hitaammin, kun arvioitu aika jää joko pysähtymättä tai todella nousuun.

Jotta käytännöllisempi esimerkki tästä, harkitse tiedostojen lataamista. Parhaillaan lataat 100 Mt tiedostoa nopeudella 1 MB / s. Tämä on erittäin helppo määritellä arvioitu valmistumisajankohta. Mutta 75% matkalla, joitakin verkon ruuhkautuneita osumia ja latausnopeus laskee 500 KB / s: iin.

Riippuen siitä, kuinka selaimesi laskee jäljellä olevan ajan, ETA: n voi hetkessä siirtyä 25 sekunnista 50 sekuntiin (vain nykyisen tilan mukaan: Koko jäljellä / latausnopeus) tai todennäköisesti selaimessa käytetään liikkuvan keskimääräisen algoritmin, joka säätyisi siirtonopeuden vaihteluille näyttämättä dramaattisia hyppyjä käyttäjälle.

Esimerkki liikkuvan algoritmin tiedoston lataamisesta voi toimia esimerkiksi:

  • Aiemman 60 sekunnin siirtonopeus muistetaan, kun uusin arvo korvaa vanhimman (esim. 61. arvo korvaa ensimmäisen).
  • Laskennan tehokas siirtonopeus on näiden mittausten keskiarvo.
  • Jäljellä oleva aika lasketaan seuraavasti: Koko jäljellä / tehokas latausnopeus

Käytä siis edellä kuvattua skenaariota (yksinkertaisuuden vuoksi käytämme 1 MB = 1000 kt):

  • 75 sekunnin kuluessa ladattavaksi 60 muistin arvoa olisi kukin 1000 kt. Tehollinen siirtonopeus on 1 000 kt (60 000 kt / 60 kp), mikä tuottaa jäljellä olevan 25 sekunnin ajan (25 000 kt / 1000 kt).
  • 76 sekunnin kuluttua (kun siirtonopeus laskee 500 kt: n tarkkuudella), tehokas latausnopeus nousee ~ 992 kt: n (59 500 kt / 60), jolloin jäljellä oleva aika on ~ 24,7 sekuntia (24 500 kt / 992 kt).
  • 77 sekunnissa: tehokas nopeus = ~ 983 kt (59 000 kt / 60), jolloin jäljellä oleva aika on ~ 24,4 sekuntia (24 000 kt / 983 kt).
  • 78 sekunnissa: Tehollinen nopeus = 975 kt (58 500 kt / 60), jolloin jäljellä oleva aika on ~ 24,1 sekuntia (23 500 kt / 975 kt).

Näkyvä kuvio näkyy tässä, kun latausnopeus laskee hitaasti keskiarvoon, jota käytetään arvioimaan jäljellä oleva aika. Tämän menetelmän mukaan, jos dip kesti vain 10 sekuntia ja palaa sitten 1 MB / s: iin, käyttäjä ei todennäköisesti huomata eroa (säästää hyvin pienen pysähdyksen arvioidussa ajassa laskemisessa).

Päästäkseen messinkille - tämä on yksinkertaisesti menetelmiä tietojen välittämiseksi loppukäyttäjälle todellisen syyn takia …

Et voi tarkasti määritellä jotain, joka on epädeterministinen

Viime kädessä etenemispalkin epätarkkuus on vähäistä siihen, että se yrittää määrittää ajan jotain, joka on epädeterminististä. Koska tietokoneet käsittelevät tehtäviä sekä kysynnän että taustalla, on lähes mahdotonta tietää, mitkä järjestelmäresurssit ovat käytettävissä milloin tahansa tulevaisuudessa - ja on järjestelmän resurssien saatavuus, joka tarvitaan minkä tahansa tehtävän suorittamiseen.

Toisen esimerkin avulla oletetaan, että suoritat ohjelmapäivitystä palvelimella, joka suorittaa varsin intensiivisen tietokannan päivityksen. Tämän päivitysprosessin aikana käyttäjä lähettää vaativan pyynnön toiseen järjestelmään, joka toimii tällä järjestelmällä. Nyt palvelinresurssit, erityisesti tietokannasta, joutuvat käsittelemään sekä päivityksen että käyttäjän käynnistämän kyselyn - skenaario, joka varmasti johtaa toimeenpanon ajankohtaan. Vaihtoehtoisesti käyttäjä voi aloittaa suuren tiedostonsiirto-pyynnön, joka verottaa tallennuskapasiteettia, mikä heikentäisi suorituskykyä. Tai ajoitettu tehtävä voisi käynnistää, joka suorittaa muistia sisältävän prosessin. Saat idean.

Ehkä realistisempi esimerkki jokapäiväiselle käyttäjälle - harkitse Windows Update -ohjelman tai virustarkistuksen suorittamista. Molemmat näistä toimista tekevät resurssitehokkaita operaatioita taustalla. Tämän seurauksena kunkin edistyksen kehitys riippuu siitä, mitä käyttäjä tekee tuolloin. Jos luet sähköpostisi, kun tämä toimii, todennäköisesti järjestelmän resurssien kysyntä on vähäistä ja edistymispalkki siirtyy johdonmukaisesti. Toisaalta, jos teet grafiikan muokkausta, niin järjestelmäresursseihin kohdistuva kysyntä on paljon suurempi, mikä saa aikaan etenemispalkin liikkeen skitsofreeniseksi.

Kaiken kaikkiaan yksinkertaisesti ei ole kristallipalloa. Jopa järjestelmä itsekin tietää, mitä kuormitusta se tulee olemaan missään vaiheessa tulevaisuudessa.

Viime kädessä se ei todellakaan ole väliä

Etenemispalkin tarkoituksena on, hyvin, osoittaa, että edistymistä todella tehdään ja että vastaavaa prosessia ei ole ripustettu. On mukavaa, kun edistymisindikaattori on tarkka, mutta tyypillisesti se on vain vähäinen ärsytys, kun se ei ole. Suurin osa kehittäjistä ei aio panostaa paljon aikaa ja vaivaa edistymispalkin algoritmeihin, koska sanotusti on paljon tärkeämpiä tehtäviä viettää aikaa.

Tietenkin sinulla on kaikki oikeus olla ärsytetty, kun etenemispalkki hyppää 99%: iin täydelliseksi ja sitten odottaa 5 minuuttia jäljelle jäävästä prosentista. Mutta jos kyseinen ohjelma toimii hyvin yleisesti, muistuta itseäsi siitä, että kehittäjällä oli ensisijaiset tavoitteensa.

Suositeltava: