Sida 2 av 2
Re: VB.net hur lägger jag till en progressbar till detta
Postat: 3 mars 2012, 15:02:05
av Horatius
mri skrev:OK, med reservation för att jag egentligen inte kan BASIC, men det här blir antagligen inte rätt:
Kod: Markera allt
ProgressBar1.Value = (pos / FS.Length) * 100
Eftersom pos och FS.Length är heltal skall uttrycket skrivas:
Kod: Markera allt
ProgressBar1.Value = (pos * 100) / FS.Length
Jo det blir rätt eftersom VB gör en flyttalskonvertering av heltal i samband med division, åtminstone blir kvoten ett flyttal. Det är först när värdet på ProgressBar1.Value ( som är av typepen Integer)
tilldelas som den avrundas till heltal. Jag trodde i ärlighetens namn att den skulle trunkera, men det spelar inte så stor roll i sammanhanget.
Din variant fungerar också men blir ganska långsam då VB måste dividera större tal. Gör en testkörning så ser du förmodligen en ganska drastisk skillnad med en större fil. pos förväntas uppnå samma värde som filens längd.
Jag kan dock inte heller VB.NET särskillt bra då jag numera kodar i C#.
Re: VB.net hur lägger jag till en progressbar till detta
Postat: 3 mars 2012, 15:52:23
av Horatius
gOry skrev:
Några tips på hur man kan göra räknaren snabbare?
Jag testade den i en virtuell maskin och körde igenom en 500MB fil på 11.5 sekunder. I tanke på att du stegar igenom varenda byte så tycker jag att den går ganska snabbt.
Statusuppdateringen lade till cirka 1 sekund. Det var ingen mätbar skillnad mellan min och mris metod. Du kan tjäna en halvsekund på att inte göra beräkningen och statusuppdateringen
vid varje iteration i huvudloopen. Du kan också tjäna någon halvsekund på att ackumulera pos i huvudloopen istället med: pos = pos + Count - 1.
Re: VB.net hur lägger jag till en progressbar till detta
Postat: 4 mars 2012, 04:23:07
av gOry
Horatius: Ja den verkar prestera bättre än tidigare program jag använt
Körde igenom en lita på sammanlagt 10GB filer, ca 15 sekunder snabbare än tidigare program jag använt.
En liten bild på hur de kan se ut.
sfv.png
Finns väl egentligen ingen anledning till varför jag satt ihop detta, enbart för att lära mig lite mer om vb.net.
Ev. så kommer jag använda delar av programmet till ett annat projekt.
Re: VB.net hur lägger jag till en progressbar till detta
Postat: 4 mars 2012, 14:14:29
av Horatius
Grattis! Grässnittet ser trevligt ut också.
Re: VB.net hur lägger jag till en progressbar till detta
Postat: 4 mars 2012, 15:42:23
av mri
Några tips på hur man kan göra räknaren snabbare?
Bara som kuriosa; Jag kom att tänka på CRC16 algoritmen som jag för länge sedan optimerade i assembler för Intel Pentium:
Kod: Markera allt
eax = initial crc value (also contains resulting crc after loop)
esi = pointer to input buffer
ecx = len
xor edx, edx ; edx = 0
mov dl, [esi] ; edx = *p
inc esi ; p++
xor dl, al ; edx = (*p ^ crc) & 0xff
inner:
shr eax, 8 ; eax = (crc >> 8)
mov ebx, [lut + edx*4] ; ebx = lut[ (*p ^ crc) & 0xff ]
mov dl, [esi] ; edx = *p
xor eax, ebx ; eax = (crc >> 8) ^ lut[ ... ]
inc esi ; p++
xor dl, al ; edx = (*p ^ crc) & 0xff
dec ecx ; --len
jnz inner
'lut' är uppslagstabellen motsvarande 'CRC32Table' i BASIC koden.
Inner-loopen borde teoretiskt exekvera på 4 klockcykler per input byte, om man bortser från eventuella cache-missar. Hur den beter sig på modernare CPU'er vågar jag inte uttala mig om.