Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

remaining time problem

[es] :: Visual Basic 6 :: remaining time problem

[ Pregleda: 1903 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.static.isp.telekom.rs.



+322 Profil

icon remaining time problem25.11.2010. u 16:22 - pre 163 meseci
Kako izračunati vreme za koje će biti odrađena određena operacija? Bitno mi je da code nije previše zakukuljen kako ne bi uticao na brzinu aplikacije koja već sama po sebi treba dugo da radi do rešenja (verovatno satima), pa da je proračun preostalog vremena ne bi dodatno usporavao?

Code:

for i=1 to 10000000
     a=i*5
next i


Gore se nalazi jednostavan code koji prolazi kroz I petlju. Kako izračunati koliko će mu vremena trebati da završi prolaz kroz petlju?
 
Odgovor na temu

vuchko.vuchko

Član broj: 217112
Poruke: 301
*.teol.net.



+2 Profil

icon Re: remaining time problem25.11.2010. u 18:35 - pre 163 meseci
Mozda ti necu reci nesto epohalno... al' evo kako sam ja to uradio:

Code:
Dim Sat As Double, Min As Double, Sec As Double
Dim Vrijeme As String
Dim priv As Double
Dim tmp1 As String
Dim tmp2 As String

Private Function MjerenjeVremena()

tmp1 = Time ' Upamti vrijeme kad je krenuo sa radom

'++++++++ Tvoja petlja ili sta vec zelis izmjeriti++++++
For i = 1 To 100000000
    priv = i * 2
Next i
'++++++++ Kraj tvoje petlje ++++++++++++++++++++++++++++

tmp2 = Time 'Uzme vrijeme kad je posao zavrsen

'******** Sad to malo obradi*************
'****************************************
Sat = (Hour(tmp2) - Hour(tmp1))
Min = (Minute(tmp2) - Minute(tmp1))
Sec = (Second(tmp2) - Second(tmp1))
Vrijeme = "Uradjeno je za :" & vbCrLf & Sat & " Sati" & vbCrLf & Min & " Minuta" & vbCrLf & Sec & " Sekundi"
MsgBox Vrijeme
End Function

Private Sub Command1_Click()
MjerenjeVremena
End Sub


Prilicno je neprecizno al na duze staze bi i mogao izmjeriti (ne mozes mjeriti u mili sekundama)!
Ovo na ovom mom starom racunaru uradi za 10 sekundi

[Ovu poruku je menjao vuchko.vuchko dana 25.11.2010. u 19:46 GMT+1]
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-2.sezampro.yu.



+322 Profil

icon Re: remaining time problem25.11.2010. u 18:55 - pre 163 meseci
m-m nije to to. Ovo je vrlo neprecizno (ja izbrojim 9 sekundi a on pokaze da je zavrsio rad za 1 minut i nesto hehe), ali to mi ni ne treba. Ono sto bi bilo potrebno je da dok se nalazi u petlji racuna za koliko ce izaci iz nje a ne da na kraju kaze koliko je dugo radio. Program ce biti u petlji 2-3-4-5h dok ne pronadje resenja. Bavi se kombinatorikom i obradom tih podataka i bilo bi dobro da korisnik moze da vidi kada ce to biti zavrseno. Putem prorress bara je vizuelno predstaljen napredak ali na pocetku napredovanja korisnik nema pojma kada ce se to zavrsiti, moze li otici na kaficu, rucak ili da prespava do sutra. :)

Kao kad kopiras neki fajl pa vidis za koliko ce sekundi\minuta zavrsiti a ne pokaze ti to samo na kraju zadatka jer tada to vec nikoga nije briga, podaci su tu hehe.
 
Odgovor na temu

Marko_L
Beograd

Član broj: 20532
Poruke: 2885
*.dynamic.sbb.rs.

Jabber: Marko_L@elitesecurity.org


+828 Profil

icon Re: remaining time problem26.11.2010. u 16:06 - pre 163 meseci
Za bilo kakva preciznija merenja, treba koristiti funkciju GetTickCount. Ovako se recimo može dobiti vreme koje je potrebno za izvršavanje petlje
Code:
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub cmdStart_Click()
Dim I As Long

Dim lTimeStart As Long
Dim lTimeEnd As Long
Dim lTimeElapsed As Long

Dim iHours As Integer
Dim iMinutes As Integer
Dim iSeconds As Integer

lTimeStart = GetTickCount

For I = 1 To 100
    DoEvents
    Print "marko"
    Sleep 1000
Next I

lTimeEnd = GetTickCount
lTimeElapsed = lTimeEnd - lTimeStart

iHours = (lTimeElapsed / 1000) \ 3600
iMinutes = ((lTimeElapsed / 1000) - (iHours * 3600)) \ 60
iSeconds = (lTimeElapsed / 1000) - (iHours * 3600) - (iMinutes * 60)

MsgBox "Vreme izvrsavanja:" & Format(iHours, "00") & ":" & Format(iMinutes, "00") & ":" & Format(iSeconds, "00")
End Sub

Dakle, prvo smo uzeli vrednost GetTickCount-a pre petlje, zatim vrednost posle petlje i onda izračunali razliku koja nam daje proteklo vreme u milisekundama. Onda te milisekunde mogu da se pretvore u hh:mm:ss format (kao što je urađeno u ovom primeru), a ako je potzrebno preciznije merenje, onda mogu da se doda i ostatak milisekundi na kraju. Inače, ovo Sleep 1000 u petlji, ukoliko neko nije shvatio, služi da malo prolongira vreme potrebno za izvršavanje petlje, čisto kako bi primer pokazao neko normalno vreme, a ne nešto tipa 30ms kao kada je prazna petlja. E sad, ako hoćeš da prikažeš približno vreme do završetka petlje, onda ćeš morati računanje da ubaciš u samu petlju. Znači, posle svake iteracije izračunaš koliko je vremena bilo potrebno za izvršavanje jedne iteracije, a to onda pomnožiš sa brojem preostalih iteracija. Kao osnovu, možeš ili da uzmeš ili prosek izvršenih iteracija ili samo vrednost prethodne iteracije. U drugom slučaju će procena biti preciznija, ali i "skakutava", tj. slično kao kada kopiraš neki fajl u Windowsu, a ono pokaže preostalo vreme 10 minuta, a onda nakon par sekundi, preostalo vreme 5 minuta. Inače, skroz tačno vreme prostalo do kraja izvršavanja petlje ne možeš da izračunaš, iz prostog razloga što brzina izvršenja varira za šta su odgovorni mnogi faktori. Recimo, možda cifre sa kojima se radi postaju veće kroz svaku iteraciju a računi komplikovaniji, ako si ubacio DoEvents, onda brzina izvršavanja zavisi i od ostalih procesa u sistemu, pa zatim opterećenosti procesora, memorije i slično. Jedino što možeš da prikažeš korisniku jeste procena. Dakle, ovako nekako:
Code:
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub cmdStart_Click()
Dim I As Long
Dim J As Long

Dim lTimeStart As Long
Dim lTimeCurrent As Long
Dim lTimeEnd As Long
Dim lTimeElapsed As Long

Dim iHours As Integer
Dim iMinutes As Integer
Dim iSeconds As Integer

J = 100

For I = 1 To J
    
    DoEvents
    lTimeStart = GetTickCount
    
    Print "marko"
    Sleep 1000

    lTimeCurrent = GetTickCount
    lTimeElapsed = (lTimeCurrent - lTimeStart) * (J - I)
    
    iHours = (lTimeElapsed / 1000) \ 3600
    iMinutes = ((lTimeElapsed / 1000) - (iHours * 3600)) \ 60
    iSeconds = (lTimeElapsed / 1000) - (iHours * 3600) - (iMinutes * 60)
    
    lblVreme.Caption = "Preostalo vreme: " & Format(iHours, "00") & ":" & Format(iMinutes, "00") & ":" & Format(iSeconds, "00")
Next I

MsgBox "Gotovo"
End Sub

Naravno, imaj u vidu da će ovo usporiti petlju, jer inače svaka instrukcija koju ubaciš u petlju usporava istu, čak i običan progressbar, a o DoEventsu i da ne pričamo. U suštini, najbrže se izvršava petlja u kojoj nema ničeg dodatnog, ni progres bara ni doeventsa, nego samo čistokrvna, bezobrazna petlja koja uzrupira sve resurse. No, pošto na taj način korisnik dobija utisak da nešto nije u redu i da se računar zakucao, onda je bolje da postoje neki indikatori. No, ako se radi o petlji sa velikim brojem iteracija, treba biti oprezan i dodati neke optimizacije. Recimo, staviti da se preostalo vreme (ili progres bar zavisno od toga šta koristiš) ne apdejtuje baš u svakoj iteraciji, nego u svakoj 10-toj ili 20-toj recimo, ili čak svakoj 100-toj, zavisno već od toga koliko iteracija ima.
-Odracuonogakomijedrpiorazmaknicu.
-Ne rxdi mi txstxturx, kxd god hocu dx
ukucxm "x" onx ukucx "x".
-Ko kaaz e da ja neuummem da kuuca
m.
-Piše "Insert disk 3", a jedva sam i ova
dva ugurao u drajv
-Postoje samo dve osobe kojima
verujem, jedna sam ja, a druga nisi ti
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-2.sezampro.yu.



+322 Profil

icon Re: remaining time problem26.11.2010. u 17:07 - pre 163 meseci
Pa ti si divan, (mislim da ti tako nesto svaki put kazem) :)

Moze li jos pomoc u drugoj temi vezano za bazu podataka?
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-5.sezampro.rs.



+322 Profil

icon Re: remaining time problem28.11.2010. u 22:09 - pre 163 meseci
Mozda nekome zatreba pa da dopunim.

Gore prikazan nacin racunanja potrebnog vremena za zavrsetak operacije davao mi je na duze staze netacan rezultat. Da bi se malo pospesio citav proces, bolje resenje je da se kroz svaki prolazak kroz petlje ne setuje novo pocetno vreme, vec da se pocetno vreme setuje samo na pocetku a vreme do zavrsetka racuna kroz odnos predjenog vremena do tog trenutka i broja izvrsenih operacija. Tako se dobija neko prosecno vreme i sto aplikacija duze radi proracun je tacniji.
 
Odgovor na temu

Marko_L
Beograd

Član broj: 20532
Poruke: 2885
*.dynamic.sbb.rs.

Jabber: Marko_L@elitesecurity.org


+828 Profil

icon Re: remaining time problem29.11.2010. u 13:08 - pre 163 meseci
Čini ti se da je taj metod tačniji. Ono što se dobija tim metodom jeste da se preostalo vreme posle nekog vremena "skrasi" na neku srednju vrednost i onda ne varira toliko kolika god da je promena u pitanju. Ovo verovatno lepše izgleda kod korisnika jer nema toliko skakutanja. Prva metoda, gde se uzima samo poslednja iteracija je preciznija u datom trenutku, jer koristi tačno vreme koje je potrebno za izvršenje jedne iteracije u tom trenutku. Pa sad, zato sam i pomenuo obe metode, pa nek svako koristi šta mu više odgovara.
-Odracuonogakomijedrpiorazmaknicu.
-Ne rxdi mi txstxturx, kxd god hocu dx
ukucxm "x" onx ukucx "x".
-Ko kaaz e da ja neuummem da kuuca
m.
-Piše "Insert disk 3", a jedva sam i ova
dva ugurao u drajv
-Postoje samo dve osobe kojima
verujem, jedna sam ja, a druga nisi ti
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-1.sezampro.yu.



+322 Profil

icon Re: remaining time problem29.11.2010. u 19:51 - pre 162 meseci
U teoriji mi to derule logicno i tacno (prvi primer), ako kada sam probao cini mi se da sve propusim kroz for petlju bez sllp komadne, ne znam zbog cega ali dolazilo je do velikog odstupanja cak i kada je vreme izvrsenje minut do 2. Sto se tice skakutanja, tacno, bije mi previse privlacno da zavrsava za 2:37, 2:40, 2:32, 2:30 ...
Malo je tesko za gledanje i imam osecaj da bi se stvorilo nepoverenje kod korisnika.

Sto se tice tacnosti druge metode, mislim da je tacniji rezultat ako npr pogleda kojim je brzino radio prethodnih pola sata nego vrednost koja se dobija za poslednju istancu. Tu se naravno treba ograditi i gledati to kroz stabilne uslove rada, tj kada se ocekuje da ce program raditi u takvim uslovima. U slucaju da nekome prvo program radi pola sata pa neku uzme da malo przi koju igricu i dodje do naglog povecanja zauzeca procesora tada ce drugi nacin biti naravno netacniji.
Al sto se kaze, sve zavisi od zelje i potrebe same aplikacije.
 
Odgovor na temu

[es] :: Visual Basic 6 :: remaining time problem

[ Pregleda: 1903 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.