Makros - Wie geht das?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Also isses wirklich genau das, was ich mir schon ma gewünscht hatte :lol: ... vor langer zeit ... ich hatte gedacht das es so was nicht gibt ... :shock: 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 :mrgreen:
Wofür Fragen stellen, wenn das andere besser können? 8) *gg*

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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 :freak:
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

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

Code: Alles auswählen

!macro test  a,b
!{
   c = a*b
!}
----------------------------------------------
edit2

und wie wäre das mit

Code: Alles auswählen

!macro test a,b
!{
    a*b
!}

c = !test 1508,4711
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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.
Bild
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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 :freak:

Achja und bei mir ist das erste immer gleich oder höher als das dritte aber nie drunter.
Zuletzt geändert von DarkDragon am 02.10.2005 17:41, insgesamt 2-mal geändert.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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..
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Ich kenn Makros bis her nur von VBA :lol: (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 :lol: /:-> ... proggen ist viel anstrengender als Schule :mrgreen:

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

@remi ...
:shock: ... 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 !!! :oops:
Ohne Debugger: 120 / 130 / 110
Zuletzt geändert von PureLust am 02.10.2005 17:46, insgesamt 1-mal geändert.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten