For JJ = 1 To 3000
Antal = 0
For J = 0 To AntalTal - 1
For JJJ = 1 To 17 Step 2
If Val(Tal(J)) = Val(Mid(Plade(JJ, 1), JJJ, 2))
Then Antal = Antal + 1
If Antal = 5 Then
Pladenummer(JJ, 1, 0) = JJ
Pladenummer(JJ, 1, 1) = J
If Val(Enere) > 0 Then
If Val(Alle) = Val(Enere) Then GoTo To1
If Val(Alle) < Val(Enere) Then
Alle = Alle + 1
End If
End If
If Val(Enere) > -1 Then
Rækker(J) = Rækker(J) & ": " & JJ +
12000 & ":01 "
Række1 = Række1 + 1
End If
Antal = 0
End If
Next JJJ
Next J
***************
Kan koden gøres hurtigere
mvh pjl
eks.
> For JJ = 1 To 3000
jjval= val(mid(plade(jj,1)))
> Antal = 0
>
> For J = 0 To AntalTal - 1
jval = val(tal(j))
>
> For JJJ = 1 To 17 Step 2
> If jval = Val(jjval), JJJ, 2))
herved beregner du kun funktionen 3000 gange i stedet for 3000*antaltal*17
håber jeg fik udtrykt mig forståeligt??
finn
nu har jeg som nævnt ikke hverken vb eller delphi installeret, men med
forbehold for kvajning, vil jeg mene der er tid hentet i følgende:
For JJ = 1 To 3000
Antal = 0
nn1 = val(enere)
For J = 0 To AntalTal - 1
talj= val(tal(j))
For JJJ = 1 To 17 Step 2
If talj = Val(Mid(Plade(JJ, 1), JJJ, 2)) Then
Antal = Antal + 1
If Antal = 5 Then
Pladenummer(JJ, 1, 0) = JJ
Pladenummer(JJ, 1, 1) = J
If nn1 > 0 Then
If nn2 = nn1) Then GoTo To1
If nn2 < nn1) Then
Alle = Alle + 1
nn2=val(alle))
End If
End If
If nn1) > -1 Then
Rækker(J) = Rækker(J) & ": " & JJ +
12000 & ":01 "
Række1 = Række1 + 1
End If
Antal = 0
End If
Next JJJ
Next J
- jeg mener også der må kunne reduceres i mid-funktionen, ved at trække
jjfunktionen ud af løkken.
din goto to 1 har ikke indflydelse på performance, men er ikke en køn
exit :-)
jeg vil unders�ge det og h�ber p� at vinde tid..
mvh pjl
hvis vi er enige om at f�lgende kode laver det samme (kun demokode)
Sub maaler()
Dim tid As Double
tid = Timer
For e = 1 To 300
For f = 1 To 300
z = Val(Str(e)) + Val(Str(f))
y = Val(Str(e)) * 5
Next
Next
tid = (Timer - tid) * 1000
Selection.InsertAfter (Str(Int(tid)))
Selection.InsertAfter (Chr(13))
tid = Timer
For e = 1 To 300
x = Val(Str(e))
For f = 1 To 300
z = x + Val(Str(f))
y = x * 5
Next
Next
tid = (Timer - tid) * 1000
Selection.InsertAfter (Str(Int(tid)))
End Sub
s� vil du erfare at f�rste kode tager ~500 sek, men anden kode kun tager
~200, alts� mere end en halvering ved kun at beregne funktionerne n�r
variablerne �ndres, og istedet s�tte dem som simple variabler.
finn
enere bliver heller ikke ændret i løkken, så den er også kandidat for en
variabel - "enerval", der hvor den ændres:
If Val(Alle) = enerval Then GoTo To1
If Val(Alle) < enerval Then
Alle = Alle + 1
End If
og alle må jo være en værdi (alle = alle+1) hvorfor så val(alle)? giver
den ikke en syntaksfejl?
finn
- men man bliver jo nysgerrig, så fortæl om resultatet!
finn
Koden i VB indeholder den samme funktion som et program fra 1988 der er
et dosprogram.. forskellen en ca. 1 sec mod mine 17 sec. !!!
Desværre er sourcekoden til det gamle dos program gået tabt, så jeg har
noget at leve op til !
Overvejer også AWK som er godt til filformatering...
hilsen pjl
finn
jeg melder tilbage hvis resultatet blir positiv.....
hilsen per
Har aldrig glemt min første kode (maskinsprog til 6502) som fandt alle
primtallene mellem 1 og 100.
Det tog dapsen ~3 timer.
En lille snak med en matematiker (~16 år)og tiden blev reduceret til ~10
min :-)
dapsen blev iøvrigt programmeret med en 8bit dipswitch og et ringetryk :-)
finn
Jeg har arbejdet med koden efter dine anvisninger.. flere parametre er
væk og resultatet ser nu sådan ud..
DoEvents
For JJ = 1 To 12000
antal = 0
For J = 0 To AntalTal - 1
talj = Val(Tal(J))
If Check2.Value = vbChecked Then GoTo Enere
For JJJ = 1 To 17 Step 2
If talj = Val(Mid(Plade(JJ, 1), JJJ, 2)) Then antal = antal + 1
If antal = 5 Then
loops = loops + 1
GoTo Start
rkmeden = rkmeden + 1
antal = 0
End If
Next JJJ
Next J
Enere:
antal = 0
Next JJ
tiden er reduceret kraftigt.. nu ca. 6-8 sec. (oprindelig tog et
gennemløb ca. 40sec.)
Kan der gøres mere her nu ?
Koden chekker en række tal i en fil (12000 linier)
filen ser sådan ud :
*....
1028 56 7483
1 3040 67 86
1529 4357 87
218 37 6472
3 203845 75
*....
tallen checkes op mod tilfældige tal Val(Tal(J))..
Det gamle program er kodet i Clipper, men desværre har jeg mistet
sourcekoden efter så mange år... 1984.
Med Clipper gøres det samme forløb på ca 1 sec. (svært irriterende)...
Noget andet er at "rnd" funktionen i VB er langsom når det drejer sig om
unique tal. For at sikre tal der ikke går igen kører talgeneratoren i et
loop.. sådan her...
For JJ = 1 To AntalTal
Om:
TTal = Int((90 * Rnd) + 1)
For J = 1 To 90
If TTal = rktal(J) Then GoTo Om
Next J
rktal(JJ) = TTal
Tal(JJ - 1) = TTal
Next JJ
mvh pjl
> For at sikre tal der ikke går igen kører talgeneratoren i et loop..
> sådan her...
>
> For JJ = 1 To AntalTal
> Om:
> TTal = Int((90 * Rnd) + 1)
>
> For J = 1 To 90
> If TTal = rktal(J) Then GoTo Om
> Next J
>
> rktal(JJ) = TTal
> Tal(JJ - 1) = TTal
> Next JJ
synes jeg ser meget kompleks ud. Jeg husker at forskellige sprog har
variationer hvordan rnd() virker, men burde den ikke kunne strikkes bedre?
som jeg forstår har du et antaltal som du henter 90 ad gangen og skal så
pille et tilfældigt tal ud ??
hvis så burde det være simplere!
finn
her findes rnd() og int() max de 90 gange pr iteration og ikke 90*rnd()
finn
next ... mener du next til n= int((90 * rnd) +1)?
her bruger jeg "Then GoTo Om"..
fandt iøvrigt en funktion på nettet efter dit princip og den finder
dubletter hurtigere..
Din kode ligner VB med lidt variationer. Meningen er dog begribelig, så
jeg er kommet langt nu.
hilsen pjl
> fandt iøvrigt en funktion på nettet efter dit princip og den finder
> dubletter hurtigere..
herligt
> Din kode ligner VB med lidt variationer. Meningen er dog begribelig, så
> jeg er kommet langt nu.
med forbehold for klummer, vil den virke i de fleste basic :-)
Men klummer kan sagtens opstå når det er 10+ år siden sidst, og jeg har
programmeret i de fleste sprog fra Cobol, via Comal, msBasic, vbBasic
dBase, xx-pascal, delphi til en kort berøring med perl
- savner det faktisk lidt!
iøvrigt havde jeg på et tidspunkt et projekt i Clipper - har glemt alt
om det, men var det ikke forbundet med dBase på en eller anden vis?
finn
jo du har ret...
Clipper var den første dBase compiler..
Jeg fik formateret mange textfiler med det program... inden for
Elektronik var det styklister sammen med tegneprogrammet Orcad.
Der eksisterer en Windows version af Clipper men den blev overhalet og
forsvandt..
i dag syntes det meningsløst at skrive et helt program i hånden uden GUI
men det gik... programmer var hvad angår hastig , windows baserede langt
overlegne.
hilsen pjl