Seite 3 von 4
Verfasst: 02.10.2005 14:20
von ts-soft
Beim kompilieren wird jeder Makroaufruf durch eben dieses ersetzt. D.h. die eigentlichen Makro-Definition sind nicht in der EXE, sondern nur im Source
Verfasst: 02.10.2005 14:30
von PMV
Also isses wirklich genau das, was ich mir schon ma gewünscht hatte

... vor langer zeit ... ich hatte gedacht das es so was nicht gibt ...

na dann kann ich endlich ohne Geschwindigkeitsverlust öfters benötigte dinge zusammen fassen *freu*
^^Ich liebe das Forum, nur durch mitlesen wird man immer schlauer
Wofür Fragen stellen, wenn das andere besser können?

*gg*
MFG PMV
Verfasst: 02.10.2005 16:30
von DarkDragon
Hmm... soll das wirklich schneller sein?
Code: Alles auswählen
#LOOPS = 10000000
Procedure Blah(par)
Protected b.l
b = par
ProcedureReturn 0
EndProcedure
!macro mycall proc,[arg] ; call procedure
!{ reverse
! pushd arg
! common
! call proc }
a.l = @Blah()
t = ElapsedMilliseconds()
For k=0 To #LOOPS
!mycall dword[v_a], dword[v_k]
Next
t1 = ElapsedMilliseconds()-t
t = ElapsedMilliseconds()
For k=0 To #LOOPS
CallFunctionFast(@Blah(), k)
Next
t2 = ElapsedMilliseconds()-t
t = ElapsedMilliseconds()
For k=0 To #LOOPS
Blah(k)
Next
t3 = ElapsedMilliseconds()-t
MessageRequester("Info", Str(t1)+"/"+Str(t2)+"/"+Str(t3))
[EDIT]
Mist jetzt hab ich schonwieder gepostet

Verfasst: 02.10.2005 16:54
von Kaeru Gaman
@DD
quark
ob du die proc nun ausm ASM callst, oder nicht is doch banane... >__<
es geht darum, sich mit nem Macro den call zu sparen
Code: Alles auswählen
Procedure CalcA(a.l,b.l)
ProcedureReturn a*b+a/b-b/a+a-b
EndProcedure
!macro CalcB
!{
c = a*b+a/b-b/a+a-b
!}
a.l = 1508
b.l = 4711
time = ElapsedMilliseconds()
For n=0 To 10000000
c = CalcA(a,b)
Next
dur1 = ElapsedMilliseconds() - time
time = ElapsedMilliseconds()
For n=0 To 10000000
!CalcB
Next
dur2 = ElapsedMilliseconds() - time
MessageRequester("speed-test", "Proc: "+Str(dur1)+Chr(13)+Chr(10)+"Macro: "+Str(dur2))
vergleiche sowas mal...
---------------------------------------------
edit1
aber mal ne andere frage... du hast parameter an das macro übergeben...
kann ich die auch irgendwie in PB-Befehlen innerhalb des macros nutzen?
also so was:
----------------------------------------------
edit2
und wie wäre das mit
Verfasst: 02.10.2005 17:17
von MVXA
> ob du die proc nun ausm ASM callst, oder nicht is doch banane... >__<
Finde ich jetzt an dieser Stelle ganz und garnicht so. Diesen Macro können
bestimmt viele gebrauchen, die schnell mehrmals bestimmte Funktionen
in einer DLL aufrufen wollen. Die CallFunctionFast Funktion hat ja noch den
zusätzlichen Funktionsüberhang, der mit abgearbeitet werden muss. Der
fällt dann beim Macro Aufruf weg.
Verfasst: 02.10.2005 17:20
von DarkDragon
sag ich doch, der prozeduraufruf durch das makro ist aber langsamer als durch eine weitere prozedur oder durch den direkten call.
Die Prozedur Blah wird 1. durchs makro aufgerufen, 2. durchs CallFunctionFast(schneller als durchs makro), 3. durch direkt. Ich weiß warum ihr(ok,
MVXA hats verstanden) den code nicht versteht, anstatt der prozedur Blah könnte man auch was anderes nehmen.
Anderes Beispiel:
Code: Alles auswählen
#LOOPS = 10000000
Global b.l
!macro mymakro val ; call procedure
!{ MOV ebx,dword [v_b]
! ADD ebx,val
! MOV dword [v_b],ebx }
Procedure myProc(val)
b.l + val
EndProcedure
b.l = 0
t = ElapsedMilliseconds()
For k=0 To #LOOPS
!mymakro dword[v_k]
Next
t1 = ElapsedMilliseconds()-t
Debug b
b.l = 0
t = ElapsedMilliseconds()
For k=0 To #LOOPS
myProc(k)
Next
t2 = ElapsedMilliseconds()-t
Debug b
b.l = 0
t = ElapsedMilliseconds()
For k=0 To #LOOPS
b + k
Next
t3 = ElapsedMilliseconds()-t
Debug b
MessageRequester("Info", Str(t1)+"/"+Str(t2)+"/"+Str(t3))
Das erste müsste wenn eure Theorie stimmt gleich dem dritten sein.
[EDIT]
Schonwieder gepostet
Achja und bei mir ist das erste immer gleich oder höher als das dritte aber nie drunter.
Verfasst: 02.10.2005 17:22
von remi_meier
@PMV: Freu dich nicht zufrüh... Fred hat mir gesagt, dass er die Makros
nicht wie inline procedures implementieren wird, also gibt es keine lokalen
Variablen!
@KG, das geht leider nicht, da PB das '!' als erstes Zeichen auf der Zeile
benötigt, dann muss aber der Rest der Zeile als ASM geschrieben werden...
EDIT:
@DD: Meine Zeiten: 2719/12484/2781

natürlich sind 1. und 3. Zeit gleich..
Verfasst: 02.10.2005 17:40
von PMV
Ich kenn Makros bis her nur von VBA

(Schule)
Ansonnsten lern ich hier grad, was Makros in der Programmiersprache wirklich sind ... oder ist das so auch nicht richtig?
Auf jeden fall geht das ja schon in PB ... er will es höchstens nciht erweitern ... wie auch immer -.-
Was ich bis jetzt mit bekommen habe ist, dass Makros in PB jetzt einfach so gehandhabt werden, als ob der Code im Makro normal immer wieder geschrieben wird. Das es da keine lokalen Variablen gibt ist eigentlich normal, zumindest hab ich das gedacht. Einfache erleichterung von Schreibarbeit

... naja
Kaeru Gaman hat aber hier immer mal wieder von einem öhm POV-Script gesprochen, entweder ich google bei zeiten mal dannach (oder wiki), oder einer machts mir einfacher und postet in kurzen sätzen mal, was er damit meint

... kaum ist schule pause, scho stürzen viele komplizierte und neue Sachen beim Programmieren auf mich ein, ich glaub ich brauch erst mal ne Pause

... proggen ist viel anstrengender als Schule
MFG PMV
Verfasst: 02.10.2005 17:41
von PureLust
@remi ...

... könnte es sein dass Du beim Test den Debugger eingeschaltet hattest ???
Meine Zeiten (ohne Debugger): 3645 / 4096 / 4016
[Edit]
Uhhps, sorry ... waren doch Zeiten mit Debugger !!!
Ohne Debugger: 120 / 130 / 110
Verfasst: 02.10.2005 17:43
von DarkDragon
Sorry für den Post aber:
remi_meier hat geschrieben:@DD: Meine Zeiten: 2719/12484/2781

natürlich sind 1. und 3. Zeit gleich..
Bei mir ists 50/160/40