Seite 1 von 2

For-Next Schleife in ASM umsetzen?

Verfasst: 29.07.2007 18:16
von PureLust
Hallo zusammen, ...

mir ist bei diversen Tests aufgefallen, dass For/Next-Schleifen in BP recht langsam sind.
Hätte da evtl. jemand ein ASM-Beispiel wie man eine For/Next-Schleife in ASM umsetzen kann?

Da es in ASM ja vermutlich keine Loop-Befehle gibt (bilde ich mir zumindest mal ein), dürfte sowas in ASM dann ja vermutlich in etwa so ablaufen:

Code: Alles auswählen

StartWert = 1
EndWert = 2000000000
Schrittweite = 5
if Schrittweite = 0 then Goto EndForNextLabel
if Schrittweite > 0 and StartWert > EndWert then Goto EndForNextLabel
if Schrittweite < 0 and StartWert < EndWert then Goto EndForNextLabel
ForNextLoopLabel:

...
... diverser Code zwischen For/Next
...

StartWert + Schrittweite
if Schrittweite > 0 and StartWert <= EndWert then Goto ForNextLoopLabel
if Schrittweite < 0 and StartWert >= EndWert then Goto ForNextLoopLabel
EndForNextLabel:
Wie würde man sowas dann also am besten in ASM umsetzen?

ThanX und Gruß, PL.

Verfasst: 29.07.2007 18:28
von Kaeru Gaman
> dass For/Next-Schleifen in BP recht langsam sind.

:shock: wus?
for-schleifen sollten eigentlich verdammt schnell sein... o_O


in ASM gibt es Branch-befehle, die einen bedingten sprung ausführen.
z.b. wenn das ergebnis vom letzten befehl 0 ist, oder wenn es nicht 0 ist, das nutzt man auch bei vergleichen,
oder wenn eine variablengrenze überschritten/unterschritten wurde.

Code: Alles auswählen

if Schrittweite > 0 and StartWert > EndWert then Goto EndForNextLabel
if Schrittweite < 0 and StartWert < EndWert then Goto EndForNextLabel 
ist unsinn, eine For-schleife wird immer mindestens 1x durchlaufen.
es findet also nur am ende ein vergleich statt.

Verfasst: 29.07.2007 18:32
von PureLust
Kaeru Gaman hat geschrieben:ist unsinn, eine For-schleife wird immer mindestens 1x durchlaufen.
Tut mir Leid, aber da unterliegt Du wieder mal einem Irrtum.

Code: Alles auswählen

For n = 4 To 3         : Debug "Mööööp." : Next n
For n = 3 To 4 Step -1 : Debug "Mööööp." : Next n
wird niemals abgearbeitet.

Verfasst: 29.07.2007 18:35
von Kaeru Gaman
dz... wieder mal was wo PB nicht "regelkonform" ist... dz dz dz

Verfasst: 29.07.2007 18:44
von PureLust
Kaeru Gaman hat geschrieben:> dass For/Next-Schleifen in BP recht langsam sind.

:shock: wus?
for-schleifen sollten eigentlich verdammt schnell sein... o_O
Naja .... langsam ist ja auch immer etwas relativ.
Mir war es halt nur aufgefallen als ich ein paar Geschwindigkeitsvergleiche zwischen 2 Lösungsansätzen gemacht hatte und die doch recht simple For/Next-Testschleife hatte mehr Zeit in Anspruch genommen als die eigentlich komplexen Berechnungen innerhalb der Schleife.

Ganz verdutzt war ich natürlich als die Schleife MIT Berechnung schneller war als die Leerschleife OHNE Berechnung. Das konnte ich dann aber mit Hilfe von !Align 4 wieder richtig stellen.

Verfasst: 29.07.2007 18:55
von Kaeru Gaman
habs grad mal angetestet:

Code: Alles auswählen

Define a.l
Define b.l = 17
Define c.l = 23
Define z.l

timer1 = ElapsedMilliseconds()

For n=0 To 100000
  For z = 0 To 10000
    a = b * c
  Next
Next

timer1 = ElapsedMilliseconds() - timer1

timer2 = ElapsedMilliseconds()

For n=0 To 100000
  z = 0
  Repeat
    a = b * c
    z + 1  
  Until z = 10000
Next

timer2 = ElapsedMilliseconds() - timer2

MessageRequester("test","for : " + Str(timer1) + #CRLF$ + "repeat : " + Str(timer2))
...For is langsamer... is ja strange...

aber gut zu wissen... also werd ichs wohl garnich mehr benutzen.. lol...

Verfasst: 29.07.2007 19:00
von PureLust
Kaeru Gaman hat geschrieben:habs grad mal angetestet:
...For is langsamer... is ja strange...
Ich kenne zwar nicht den Unterschied in dem jeweils erzeugten ASM-Code, aber das For/Next nun langsamer als Repeat/Until ist kann man durch einen so einfachen Test nicht wirklich ermitteln.
Kommt drauf an wo genau sich die zu vergleichenden Routinen im Speicher befinden (siehe Link)
Tausch die For/Next und die Repeat-Schleife mal aus und es könnte schon wieder anders aussehen.

Verfasst: 29.07.2007 20:22
von Kaeru Gaman
dann könnte man auch mal beide testroutinen mit Align4 versehen,
wenn du meinst, dass das so immens wichtig ist.

oder den testcode so verändern, dass der test x-mal an unterschiedlichen stellen durchgeführt wird.. wie auch immer.

da aber in diesem test die For-schleife 40%(!) länger gedauert hat,
als die repeat, halte ich das schon für signifikant.

natürlich kann man immer argumentieren, dass der Inhalt der schleife immer am längsten dauert,
und dass geschickte optimierungen dort den einsatz von Aling4 bzw. repeat statt for zu verwenden redundant machen.

Re: For-Next Schleife in ASM umsetzen?

Verfasst: 29.07.2007 20:46
von coMstructor
PureLust hat geschrieben: Hätte da evtl. jemand ein ASM-Beispiel wie man eine For/Next-Schleife in ASM umsetzen kann?
ist zwar nicht direkt das was du brauchst, aber ich denke das kann dir weiterhelfen : http://progcom.pr.ohost.de/v2/?q=node/20 hab ich mal vor kurzem geschrieben. darin werden andere schleifen zu asm generiert. Hoffe das hilft :allright:

Verfasst: 29.07.2007 23:31
von Kiffi
PureLust hat geschrieben:Tut mir Leid, aber da unterliegt Du wieder mal einem Irrtum.

Code: Alles auswählen

For n = 4 To 3         : Debug "Mööööp." : Next n
For n = 3 To 4 Step -1 : Debug "Mööööp." : Next n
wird niemals abgearbeitet.
Kaeru Gaman hat geschrieben:dz... wieder mal was wo PB nicht "regelkonform" ist... dz dz dz
in welcher Sprache wird eine For-Next-Schleife denn mindestens 1mal
durchlaufen? Ich zumindest kenne keine.

Grüße ... Kiffi