Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Bedre kode...

2 views
Skip to first unread message

Per Juul Larsen

unread,
Jun 26, 2010, 3:42:31 PM6/26/10
to
hej..
Jeg har den del opperationer i mit program som dette:
***********

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


cykelsmeden

unread,
Jul 1, 2010, 9:43:09 AM7/1/10
to
nu er det en menneskealder siden, og jeg orker ikke dechiffrere
funktionen, men det slår mig at du flere steder beregner en værdi
(funktionen) "udefor samme løkke"
Jeg mener du henter megen tid ved at sætte en værdi for tallet i hver
tæller og anvende denne.

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

cykelsmeden

unread,
Jul 1, 2010, 11:28:38 AM7/1/10
to
Den 26-06-2010 21:42, Per Juul Larsen skrev:

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 :-)

Per Juul Larsen

unread,
Jul 2, 2010, 3:18:25 PM7/2/10
to
Den 01-07-2010 15:43, cykelsmeden skrev:
> Den 26-06-2010 21:42, Per Juul Larsen skrev:
>>
>> 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
> nu er det en menneskealder siden, og jeg orker ikke dechiffrere
> funktionen, men det sl�r mig at du flere steder beregner en v�rdi
> (funktionen) "udefor samme l�kke"
> Jeg mener du henter megen tid ved at s�tte en v�rdi for tallet i hver
> t�ller og anvende denne.

>
> 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
tak for din tid..

jeg vil unders�ge det og h�ber p� at vinde tid..

mvh pjl

cykelsmeden

unread,
Jul 2, 2010, 6:29:18 PM7/2/10
to
Den 02-07-2010 21:18, Per Juul Larsen skrev:
> det sl�r mig at du flere steder beregner en v�rdi
> (funktionen) "udefor samme l�kke"
kom lige i tanke om vb i word2003 :-)

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

Per Juul Larsen

unread,
Jul 3, 2010, 2:07:18 AM7/3/10
to
Den 03-07-2010 00:29, cykelsmeden skrev:
> Den 02-07-2010 21:18, Per Juul Larsen skrev:
>> det slår mig at du flere steder beregner en værdi
>> (funktionen) "udefor samme løkke"
> kom lige i tanke om vb i word2003 :-)
>
> 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
tak for tippet..
Jeg vil nu undersøget koden og håber på at få hentet noget tid hjem.
Programmet er ret gammelt og med tiden glemmer man ideen når koden
genses igen..
Du har givet mig gode tip som jeg kan arbejde med her i fodboldtiden..!
mvh pjl

cykelsmeden

unread,
Jul 3, 2010, 3:44:11 AM7/3/10
to
Den 03-07-2010 08:07, Per Juul Larsen skrev:
> Programmet er ret gammelt og med tiden glemmer man ideen når koden
> genses igen..
> Du har givet mig gode tip som jeg kan arbejde med her i fodboldtiden..!
> mvh pjl

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

Per Juul Larsen

unread,
Jul 3, 2010, 4:34:11 AM7/3/10
to
Tak for din interesse.
Jeg melder mig igen når og hvis jeg får kodet noget bedre iflg. dine
anvisninger.
Jeg var klar over at min kode er håbløs og meldte mig derfor her i
forum.. Det bekræfter min antagelse.. desværre er det mange år side at
jeg sad og nørklede det sammen, så jeg skal igennem det hele igen.
(hukommelsen er svækket af mine nu 67 !)
I virkeligheden indeholder koden samme rutine 9 gange med forskellige
betingelse, og det tager ca. 17 sec at gennemføre en test af talfilen
(12000) linier.

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

cykelsmeden

unread,
Jul 3, 2010, 5:32:44 AM7/3/10
to
Den 03-07-2010 10:34, Per Juul Larsen skrev:
> (hukommelsen er svækket af mine nu 67 !)
og her sidder man og tror manputter guldkorn ind i hovedet på en knægt!
og så diskuterer man med en jævnaldrende :>)


finn

Per Juul Larsen

unread,
Jul 3, 2010, 6:43:08 AM7/3/10
to
..netop det spændende ved internettet.. anonymiteten kan gi sjove
overraskelser......

jeg melder tilbage hvis resultatet blir positiv.....
hilsen per

Per Juul Larsen

unread,
Jul 6, 2010, 2:11:01 PM7/6/10
to
Har testet koden og den fungerer fint.. min tid var 48 sec., din kode
ca. 25 sec... så du har ret i at tiden halveres.
Tak for hjælpen..den minder om at det ikke er ligegyldigt hvordan man
koder...!
Du har foreslået andre tiltag...dem har jeg dog ikke testet endnu.. så
det er din oprindelige kode som fungerer fint i første test!!
mvh per

cykelsmeden

unread,
Jul 13, 2010, 7:38:02 AM7/13/10
to
Den 06-07-2010 20:11, Per Juul Larsen skrev:
> det ikke er ligegyldigt hvordan man koder...!

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

Per Juul Larsen

unread,
Jul 13, 2010, 4:32:05 PM7/13/10
to
..
den husker jeg udmærket men først senere ændrede jeg opfattelse af
"microcomputerne"... på mit første microprocessor kursus, skulle vi
evaluere undervisningen... min holdning var at den slags "værktøj"
aldrig blev populært.. uden interface var det håbløst!.. og se så hvad
styresystemerne gjorde med tiden..!..
mvh pjl

Per Juul Larsen

unread,
Jul 14, 2010, 3:15:10 PM7/14/10
to
Den 03-07-2010 09:44, cykelsmeden skrev:

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

cykelsmeden

unread,
Jul 14, 2010, 6:11:22 PM7/14/10
to
Den 14-07-2010 21:15, Per Juul Larsen skrev:
Umiddelbart har jeg ikke bedre forslag, men som tidligere nævnt, er jeg
IKKE talmand :)


> 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

cykelsmeden

unread,
Jul 14, 2010, 7:39:08 PM7/14/10
to
hvis jeg har forstået opgaven, ville min vej være at huske en matrise.
opslag er formodentligt markant hurtigere end rnd(), så vælg kun rnd()
for tal som ikke har været udtrukket, ala:
;lav et 2dim skema
dim tal 90,1
;sæt kol1 = 0-90 og kol2 false
for j = 0 to 90
tal (J,0)= j
tal (j,1)= 0
next
;find tal
for jj = 1 to antaltal
;find tilfældigt
n= int((90 * rnd) +1)
; har vi haft det spild ikke rnd
if tal (n,1) = 1
then
next
;ellers brug det
else
rktal(jj) = n
;og husk det er brugt
tal(j,1) = 1
next

her findes rnd() og int() max de 90 gange pr iteration og ikke 90*rnd()

finn

Per Juul Larsen

unread,
Jul 15, 2010, 6:00:20 PM7/15/10
to
..du koder..!

" if tal (n,1) = 1
> then
> next"

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


cykelsmeden

unread,
Jul 16, 2010, 9:42:15 AM7/16/10
to
Den 16-07-2010 00:00, Per Juul Larsen skrev:
> her bruger jeg "Then GoTo Om"..
ok, goto er en instruktion jeg KUN bruger hvis jeg ikke kan andet - det
sker sjældent


> 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

Per Juul Larsen

unread,
Jul 16, 2010, 10:41:25 AM7/16/10
to

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

0 new messages