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 ! :twisted:
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