For-Next Schleife in ASM umsetzen?

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

For-Next Schleife in ASM umsetzen?

Beitrag 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.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag 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.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

dz... wieder mal was wo PB nicht "regelkonform" ist... dz dz dz
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag 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.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag 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.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
coMstructor
Beiträge: 130
Registriert: 04.07.2006 20:10
Kontaktdaten:

Re: For-Next Schleife in ASM umsetzen?

Beitrag 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:
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Antworten