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

Beitrag von remi_meier »

So, mir war langweilig, deshalb hab ich ein kleines Plugin für jaPBe gemacht :D

Achtung: Diese Angaben sind veraltet, bitte immer den letzten Post anschauen!

http://mypage.bluewin.ch/remimeier/webs ... mierer.zip
KEINE Garantie auf totale Perfektion (d.h. es kann Bugs enthalten) :wink:
Dieses kleine Plugin optimiert den AsmOutput auf folgende Probleme:
- x=x (unnütz, ich weiss...)
- a-1 (jep, mit DEC)
- c - a / d (teilweise)
- a=b%2
- a%2

Das Plugin muss in den Unterordner Plugins von jaPBe kopiert werden. Es erzeugt dann bei Aufruf eine Optimiert.exe im Compilers\ Verzeichnis von PB. Dabei ist folgendes zu beachten:
- Sourcecode muss abgespeichert sein
- Sourcecode darf keine IncludeFiles besitzen (d.h. Cutterplugin benutzen!)
- Der Ordner der Exe wird dann PB\Compilers\ sein! (wegen Include* Zeugs)
- Es werden keine Fehlermeldungen des Compilers angezeigt (ausser man ist Superman und kann beim kurzen aufblitzen des cmd was sehen :mrgreen: )

Hier ein kleiner Testcode (natürlich ein unrealistisch optimales Beispiel :wink: ):

Code: Alles auswählen

a = 5
b = 6
c = 7
d = 3
#N = 99999999

Delay(1000)

time1 = ElapsedMilliseconds()
For z = 1 To #N
  a = a
  b - 1
  c - a / d
  c = a % 2
  c = c % 2
Next
time1 = ElapsedMilliseconds() - time1

time2 = ElapsedMilliseconds()
For z = 1 To #N
  !DEC [v_b] 
  
  !MOV    Ebx,dword [v_c] 
  !MOV    Eax,dword [v_a] 
  !MOV    Edi,dword [v_d] 
  !CDQ 
  !IDIV   Edi 
  !SUB    Ebx,Eax 
  !MOV    dword [v_c],Ebx 
  
  !MOV    Eax,dword [v_a] 
  !AND    Eax,1 
  !MOV    dword [v_c],Eax 
  
  !AND    dword[v_c], 1 
Next
time2 = ElapsedMilliseconds() - time2

MessageRequester("", Str(time1)+" "+Str(time2))
Meine Resultate:
Ohne Optimierer:
7453ms(PB) gegen 2453ms(ASM)

Mit Optimierer:
2578ms gegen 2500ms

Viel Spass :D
remi

PS: War nur n Zeitvertreib, deshalb nicht zu viel erwarten!
Zuletzt geändert von remi_meier am 17.02.2005 14:09, insgesamt 1-mal geändert.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46
Wohnort: Luxemburg
Kontaktdaten:

Beitrag von hardfalcon »

Ist aber ein guter Ansatz. DEreinbau in den PB-Compiler wäre IMHO durchaus wünschenswert. Das Argument für ein fertiges Programm ist nicht, wie schnell man es kompiliert hat (weil der Compiler nicht optimiert),sondert wie gut/hoch es optimiert ist.
„Warum siehst du den Splitter im Auge deines Bruders, aber den dicken fetten schwarzen Zensurbalken vor deinem Auge bemerkst du nicht?“
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag von GPI »

wobei optimiert immer zweischneidig ist.

Man kann auf zwei arten Optimieren (jetzt kommen blöde beispiele, aber der sinn sollte verdeutlicht werden):

Auf Dateigröße:

Code: Alles auswählen

dim a(2)
For i=0 to 2
   a(i)=x:x=(x+1)*2
next
Und auf geschwindigkeit

Code: Alles auswählen

dim a(2)
a(0)=0
a(1)=2
a(2)=6
(denkt euch anstatt der a(2) mal a(100), dann sieht man es gut, aber ich bin jetzt ein bischen Schreibfaul.

Beide Codes machen absolut das gleiche. Aber Code 1 ist dank schleifen und Variable X langsamer, dafür ist Code 2 wesentlich größer (vorallen bei großen werten).
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Die Optimierungen von remi_meier werden die Dateigröße, so wie ich das sehe, nicht vergrößern, sonder bügeln paar Unreinheiten von PB aus.
Und selbst wenn die Größe ein bischen ansteigt, wer achtet heute noch darauf ob die Exe 10 KB oder 100 KB groß ist?
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Also bei meinen Optimierungen wird die Grösse und der Speed besser. Diese Optimierungen sind nicht sehr intelligent, es wird einfach nach einem bestimmten Muster gesucht, z.B.:
; MOV Ebx,dword [v_x]
; MOV Edi,dword [v_y]
; PUSH dword [v_z]
; MOV Eax,Edi
; POP Edi

und dann mit den gleichen Parametern in
; MOV ebx,dword [v_x]
; MOV Eax,dword [v_y]
; Mov Edi,dword [v_z]
gekürzt und hier somit auch beschleunigt...
Es ist wie gesagt sehr beschränkt auf ein paar spezifische Situationen. Wenn ich mal wieder ein bisschen Langeweile hab, werd ich mich vielleicht mal an einen "intelligenten" Optimierer machen, der dann auch 'unbekannte' Situationen erkennt und optimiert.

greetz
remi
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag von GPI »

Hmm, ich frage mich gerade, warum sowas gemacht wurde. Kann es sein, das bestimmte Prozessortypen (vor Pentium bzw) nicht mit der Optimierung laufen?

Nur intressehalber.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Wenn ich dich richtig verstehe fragst du, wieso folgendes gemacht wurde?
; MOV Ebx,dword [v_x]
; MOV Edi,dword [v_y]
; PUSH dword [v_z]
; MOV Eax,Edi
; POP Edi
Das liegt ganz einfach am Berechnungsalgorithmus von PB, ich weiss auch nicht, wie der aussieht, aber nach meiner Kenntnis läuft die Optimierung überall..
Es könnte zwar sein, dass eine illegale MOV Operation durch meine Optimierungen zustande kommen kann (wie gesagt, war nur n Zeitvertreib), was zwar eher unwahrscheinlich ist...

greetz
remi
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1754
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

Ich habe Fred zumindest mal auf diesen Thread hingewiesen, ob er sich daraus etwas für PB nützliches erschließen kann, muss er selber entscheiden... 8)
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag von GPI »

remi_meier hat geschrieben:Es könnte zwar sein, dass eine illegale MOV Operation durch meine Optimierungen zustande kommen kann (wie gesagt, war nur n Zeitvertreib), was zwar eher unwahrscheinlich ist...
Mit Assemblerprogrammierung (PC) kenn ich mich nicht so aus, deshalb die Frage. Denkbar wäre es bzw. das der Code so nicht mehr auf einen Pentium 1 läuft.

Generell finde ich es schade, das PB ein bischen zu sehr auf abwärtskompatiblität setzt. Die Codes laufen ja ohne Problem auf einen 486, heute kaum noch nötig.

Für die Compileroptions wäre es schön, eine Option zu setzen, so das aktuellere CPU-Befehle unterstützt werden. Meiner Meinung nach kann man sehr wohl die Unterstützung bis einschließlich Pentium2 langsam vergessen...
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
Lars
Beiträge: 347
Registriert: 31.08.2004 23:53
Wohnort: Shanghai
Kontaktdaten:

Beitrag von Lars »

GPI hat geschrieben:Für die Compileroptions wäre es schön, eine Option zu setzen, so das aktuellere CPU-Befehle unterstützt werden. Meiner Meinung nach kann man sehr wohl die Unterstützung bis einschließlich Pentium2 langsam vergessen...
Das sehe ich anders, für mich ist es wichtig, dass mein (fiktiver)
selbstprogrammierter Server auch auf meiner kleinen 486er Linux-Box
läuft.

Aber eine Compileroption wäre schon nett, aber das ist wahrscheinlich
wieder zu viel verlangt <)
Lars
The only problem with troubleshooting is, that sometimes the trouble shoots back.
P4 2,6Ghz, 512MB RAM, GeForce 6200, WinXP Pro SP2, PB V3.94
Antworten