Seite 2 von 5
Re: Compiler-Optimierungen
Verfasst: 02.01.2005 16:07
von Kristel
remi_meier hat geschrieben:Ich habe hier selbst einige aufgeführt, die ich noch gefunden habe:
Code: Alles auswählen
3) x + 1 wird zu INC v_x, aber x - 1 nicht zu DEC v_x:
; x + 1
INC dword [v_x]
; x - 1
MOV ebx,dword [v_x]
ADD ebx,-1
MOV dword [v_x],ebx
Ich denke nicht, dass das schneller sein soll...
Vor allem das DEC will ich haben !

Hm..mir ist so als hätte ich das schon mal irgendwo geschrieben.
Schön dass sich noch jemand für meine Anregungen (außer Rob)
interressiert.
Verfasst: 02.01.2005 16:19
von redacid
Ich habe keine Ahnung von Assembler und Compilerbau. Allerdings denke ich schon, dass es nicht allzu schwer sein sollte, das DEC einzubauen *grübel*.
Was ich mich allerdings frage: welchen Vorteil hätte man dadurch? Kleinere Executables und/oder schnellere Ausführung des Codes?
Dass dies (wenn überhaupt) nur minimal sein würde, ist mir klar, aber Kleinvieh macht nunmal auch Mist...
Verfasst: 02.01.2005 16:29
von remi_meier
Code: Alles auswählen
x.l = 10000
#test = 500000000
Delay(1000)
time1 = ElapsedMilliseconds()
For z = 0 To #test
If x < 0 : x = 10000 : EndIf
x - 1
Next
time1 = ElapsedMilliseconds() - time1
time2 = ElapsedMilliseconds()
For z = 0 To #test
If x < 0 : x = 10000 : EndIf
DEC x
Next
time2 = ElapsedMilliseconds() - time2
MessageRequester("", Str(time1)+" "+Str(time2))
Verfasst: 02.01.2005 18:18
von NicTheQuick
Für alle, die es nicht ausprobieren möchten. Ergebnis: "4326 3725"
600 ms Differenz nach 500 Millionen Schleifendurchläufen.
Verfasst: 02.01.2005 22:52
von Helle
Zur DEC-"Problematik": Der DEC-Befehl verändert nicht das Carry-Flag,
das aufgeführte Konstrukt mit ADD dagegen schon! Wichtig für Abfragen
über die Grösse von "x" (das "borgen"). DEC sollte man nur verwenden,
wenn dies keine Rolle spielt bzw. man weis, was man tut.
Gruss
Helle
Verfasst: 04.01.2005 00:05
von NicTheQuick
Was ist denn das Carry-Flag?
Verfasst: 04.01.2005 02:39
von MARTIN
Carry-Flag ist das erste Flag im Flagregistrer.
Es wird dann gesetzt wenn auf Grund einer Addition oder Subtraktion das Ergibnis nicht in einen Register oder Speicherstelle passt.Man kann Carry-Flag auch mit dem befehl STC setzen.
Ich habe nur rudimentäre assembler kenntnisse, also vielleicht ist diese nicht ganz korrekt.
Verfasst: 04.01.2005 15:13
von remi_meier
Hmm... Stimmt!
INC auch nicht...
Dann würde ich vorschlagen, dass der Debugger ADD -1 und ADD 1 benutzt und die fertige Executable dann INC und DEC. So kann man im Debugger die Fehler abfangen aber in der EXE den vollen Speed nutzen. (nur so eine Idee....)
Verfasst: 04.01.2005 19:34
von Kaeru Gaman
oauerha...
wie wäre es, wenn x +/- 1 das ADD benutzt,
und man zusätzlich ein x++ implementiert, dass als INC übersetzt wird?
so wie es im moment ist, muss der compiler ja abfangen, ob es 1 oder eine andere zahl ist,
und danach den code einrichten.
naja, aber im grunde sollte er das ja, gemäss der aussage,
dass PB zuerst optimierten ASM-code erzeugt,
und dann compiliert.
ist ja schliesslich eines der besten verkaufsargumente für PB.
btw: meines wissens beeinflussen INC und DEC zwar nicht CARRY, aber ZERO...
Verfasst: 08.02.2005 14:17
von remi_meier
Hab nochmals was ausprobiert:
Code: Alles auswählen
a = 5
b = a % 2
Debug b
;Purebasic
; b = a % 2
MOV ebx,dword [v_a]
MOV eax,ebx
MOV ebx,2
CDQ
IDIV ebx
MOV ebx,edx
MOV dword [v_b],ebx
Debug b
;PB Output optimiert
; b = a % 2
MOV eax,dword [v_a]
MOV ebx,2
CDQ
IDIV ebx
MOV dword [v_b],edx
Debug b
;mein Vorschlag für % 2
; b = a % 2
MOV eax,dword [v_a]
!AND eax,1
MOV dword [v_b],eax
Debug b
Wenn nur schon mal die Optimierung
MOV ebx,dword [v_a]
MOV eax,ebx
drinn wäre... vielleicht macht das FASM aber auch schon... Wäre auf jeden Fall kein Problem einen kleinen Optimierer zu machen der den Asm Output nach solchen Zeilen durchsucht.
greetz
remi