Compiler-Optimierungen

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.
Kristel
Beiträge: 72
Registriert: 30.08.2004 00:17

Re: Compiler-Optimierungen

Beitrag 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.
Benutzeravatar
redacid
Beiträge: 581
Registriert: 29.08.2004 17:06

Beitrag 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...
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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))
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von NicTheQuick »

Für alle, die es nicht ausprobieren möchten. Ergebnis: "4326 3725"
600 ms Differenz nach 500 Millionen Schleifendurchläufen.
Bild
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von NicTheQuick »

Was ist denn das Carry-Flag?
Bild
MARTIN
Beiträge: 454
Registriert: 08.09.2004 14:03
Wohnort: Kiel

Beitrag 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.
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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....)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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
Antworten