Just another Purebasic Optimizer V 1.14

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Just another Purebasic Optimizer V 1.14

Beitrag von Deeem2031 »

Ich hat mal wieder ein bisl Langeweile und hab ein Proggy geschrieben, was genauso wie remi_meiers Optimierer den Asm-Output von PB optimiert. Warum ich ned einfach remi gesagt hab, das er das einbauen soll, was ich rausgefunden hab? Ganz einfach, ich wollt das schnell mal ausprobieren obs funzt und remi war nicht online, also blieb mir nichts anderes übrig als mir selber ein Optimierer zu basteln.
Aber keine Angst, mein Optimierer läuft zusammen mit remis, man kann also beide verwenden.

Link: http://www.deeem2031.de/PB/D_Optimizer.zip

Features:
(bei Proceduren)
-löscht unnötige Push/Pops bei Procedureaufrufen
-der ClearLoop wird durch eine schnellere Routine ersetzt
-Ecx wird immer vom Stack gelöscht
-Esi wird wenn möglich mit Esp ersetzt
-steht ein ProcedureReturn am Ende einer Procedure wird das zurücksetzen des Ergebnisses gelöscht
(anderes)
-For-Next Schleifen werden, wenn möglich, vervielfacht (der Code wird zwar größer, dafür läuft es aber ein wenig schneller)
-ersetzen von SYS_StringEqual mit Nullstrings durch direkte Verarbeitung
-löschen von doppelten Stringenden (verringert nur eventuell die Größe, auf die Geschwindigkeit hat es keinen Einfluss)

Installations-Anleitung:
-ohne remis Optimierer:
->"...\Purebasic\Compilers\Fasm.exe" zu "Fasm2.exe" umbenennen
->Den Inhalt der zip in den "...\Purebasic\Compilers\"-Ordner packen
->freuen :)

-mit remis Optimierer:
->"...\Purebasic\Compilers\Fasm.exe" zu "Remis_Optimierer.exe" umbenennen (man kann der Exe auch einen anderen namen verpassen)
->Den Inhalt der zip in den "...\Purebasic\Compilers\"-Ordner packen
->"D_Optimierer.ini" öffnen und bei "FasmExe" "Remis_Optimierer.exe" angeben -> "FasmExe = Remis_Optimierer.exe"
->freuen :)

Noch'n Bsp:

Code: Alles auswählen

Procedure a(x)
  Protected a,b,c
  a = x
  ProcedureReturn a
EndProcedure

#r = 40000000

s.s = ":)"

st1 = GetTickCount_()
For i = 1 To #r
  If s
    a(2)
  EndIf
Next
t1 = GetTickCount_()-st1

MessageRequester("",Str(t1))
Bei mir:
-ohne Optimierung: 1172 ms
-mit Optimierung: 406ms
Zuletzt geändert von Deeem2031 am 16.12.2005 02:39, insgesamt 7-mal geändert.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
merlin
Beiträge: 157
Registriert: 30.07.2005 22:15

Beitrag von merlin »

Geile Sache Deeem2031 ;-) Bei mir...

Ohne Opt: 296 - 313
Mit Opt.: 218 - 234
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

:allright:
Gute Idee :)

Nun, aber wie funktionieren beide Optimizer nebeneinander?
Wenn du mir das gesagt hast, werd ich deine Idee nicht klauen :twisted:
(könnte natürlich auch bei mir was ändern^^)

greetz
Remi
merlin
Beiträge: 157
Registriert: 30.07.2005 22:15

Beitrag von merlin »

@remi
ini datei auf dein optimizer ändern....
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Ah genau :)
Danke!

EDIT: @Deeem, jetzt musst du nur noch die Fehlerübermittlung von FASM-
Fehlern einbauen...
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

remi_meier hat geschrieben:EDIT: @Deeem, jetzt musst du nur noch die Fehlerübermittlung von FASM-Fehlern einbauen...
Wie.. funzt das bei dir nicht? Also bei mir kann ich fröhlich ASM-Fehler einbauen und bekomm auch die Fehlermeldungen zurück.

EDIT: Ups, hatte ich doch glatt den Optimierer ausgeschaltet ^^
Mom, bekomm ich auch noch hin, weiß zwar noch nich wie, aber...
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Update V1.01:

-ASM-Fehlermeldungen werden jetzt richtig angezeigt (thx to remi_meier)
-der ClearLoop wird durch eine schnellere Routine ersetzt

Die "Möglichkeit den ClearLoop der Proceduren zu löschen. (der setzt alle protected vars auf 0 zurück... meistens unnötig)" wurd doch nichts, weil die Strings von PB das zurücksetzen unbedingt brauchen. Würde also nur funktionieren wenn man keine Strings in Procs benutzt, aber dafür wird der Loop jetzt ersetzt.

Dadurch wird das Beispiel vom ersten Post von 500 auf 234 ms schnell :)

Downloadlink, wie vorher auch: http://www.deeem2031.de/PB/D_Optimizer.zip (18 KB)
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

So, inzwischen schon V. 1.03:

Hat sich aber nicht viel getan:
-startet man die Exe direkt werden paar Infos angezeigt
-Ecx wird immer vom Stack gelöscht
-Esi wird wenn möglich mit Esp ersetzt
-das Beispiel ist dadurch nochmal 30 ms schneller -> ca. 200

Damit bin ich mit der Procedure-Optimierung eigentlich am Ende, jedenfalls ist mir nichts mehr aufgefallen was man an den Procs optimieren könnte. ...obwohl da fällt mir grad was auf... naja, später ;)

Für die, die zu faul sind nachzugucken, aber trotzdem gern wüssten was da so optimiert wird:

Orginal:

Code: Alles auswählen

_Procedure0:
  PUSH   ebx
  PUSH   ecx
  PUSH   ebp
  PUSH   esi
  PUSH   edi
         MOV esi,esp
  SUB    esp,16
  MOV    eax,esp
  MOV    edx,eax
  ADD    edx,16
_ClearLoop0:
  MOV    dword [eax],0
  ADD    eax,4
  CMP    eax,edx
  JNE   _ClearLoop0
  MOV    eax, dword [esi+24]
  MOV    dword [esp+0],eax
; Protected a,b,c 
; a = x 
  MOV    eax,dword [esp]
  MOV    dword [esp+4],eax
; EndProcedure 
  XOR    eax,eax
_EndProcedure1:
  ADD    esp,16
  POP    edi
  POP    esi
  POP    ebp
  POP    ecx
  POP    ebx
  RET    4
_EndProcedure0:
optimiert:

Code: Alles auswählen

_Procedure0:
PUSH  0
PUSH  0
PUSH  0
PUSH  0
mov eax, dword [Esp-20+16+24]
 MOV dword [esp+0],eax
 MOV eax,dword [esp]
 MOV dword [esp+4],eax
 XOR eax,eax
_EndProcedure1:
 ADD esp,16
 RET 4
_EndProcedure0:
"mov eax, dword [Esp-20+16+24]" sieht zwar nich wirklich intelligent aus, funktioniert aber wie es soll ;)
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Hm, alle sprachlos vor staunen, oder bin ich zu schnell mit den Updates? ;)

V 1.04:
-LogDatei kann jetzt überschrieben werden
-Log-Ausgabe ein wenig ausgebessert
-For-Next Schleifen werden, wenn möglich, vervielfacht (der Code wird zwar größer, dafür läuft es aber ein wenig schneller)

Dadurch hab ich nochmal 30 ms gespart -> 170 ms
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Wäre interessant, wenn du die Sources bei legen könntest. Ich hab hier
Linux laufen und da ist exe nicht so ohne Wine <_<...
Bild
Antworten