Hallo, was ist schneller? Arbeiten mit "globalen Variablen", mit "Call by Referenzen" oder mit richtigen Zeigern. Oder kann man das pauschal nicht sagen. Platform ein handelsüblicher ATmega16. Merci für die Diskussion, Sebastian
Globale Variablen sind meist schneller, da diese konstant sind und somit nicht erst geladen werden müssen.
Würde ich auch behaupten. Wenn mal ein wenig Luft habe werde ich das mit dem Simulator mal testen.
Wenn die Variablen dauerhaft in Registern gehalten werden, geht's kaum schneller. z.B.: .def temp = r17 .def bit_counter = r18
"Globale Variablen sind meist schneller, da diese konstant sind und somit nicht erst geladen werden müssen." Das ist komplett falsch beim AVR, da der AVR keine Operationen direkt im SRAM ausführen kann, sondern nur auf Registern. Man sollte immer soviel wie möglich lokale Variablen verwenden. Das ergibt schnellen und kurzen Code, da lokale Variablen meist in Registern angelegt werden. Beim 8051 ist das ähnlich, da einem bei vielen globalen Variablen schnell der DATA-Bereich ausgeht und man dann die Variablen in XDATA ablegen muß. Peter
@Peter Das ist schon klar, aber so wie ich das verstehe gehts hier um die Übergabe von Daten von einer Funktion in C. Und da sind globale Variablen nunmal am schnellsten, da der Compiler diese zu std Variable, Register übersetzt Pointer müssen erst in r30,31 kopiert werden usw.
> was ist schneller?
Was soll die Raterei? Schreib ein kleines Testprogramm und miss es
einfach.
@Benedikt, auch Argumente werden in Registern übergeben, wenn es nicht sehr viele sind. D.h. der Aufrufer muß sie nicht erst im SRAM ablegen und der Aufgerufene wieder von dort holen. Die Übergabe eines Funktionspointers in Registern kostet außerdem nur ein einziges MOVW nach X,Y oder Z bei den Megas. Der AVR-GCC kann auch Strukturen in Registern zurückgeben, wenn man mehrere Rückgabewerte liefern will. Sieht erstaunlich effizient aus. Ich nehme aber lieber Pointer, finde ich übersichtlicher. Peter
die ganze geschichte kommt wirklich auf compiler, situation und Baustein an, beim 80C51 und SDCC war es zB so, dass diverse globale Variablen Code-schonender (somit schneller) waren, während manchmal ne Parameterübergabe schneller war. Beim PIC controller mit CC5X compiler brauch man sich aber zB keine sorgen machen, der compiler ist so mächtig, der rödelt das schon so zurecht, wies am schnellsten / speicher sparendsten ist. > Man sollte immer soviel wie möglich lokale Variablen verwenden. bullshit, ausprobieren und n paar mal mehr auf F5 kloppen (oder wo auch immer) ist immer das beste. > Mich würde noch interessieren, was er unter "richtigen Zeigern" versteht. Zeiger = Pointer, wat sonst? Meiner Meinung nach sind Pointer immer effizienter, da bin ich aber nu absolut nicht sicher...
>> Mich würde noch interessieren, was er unter "richtigen Zeigern" >> versteht. > Zeiger = Pointer, wat sonst? Ach nee. Aber wenn es "richtige Zeiger" gibt, muß es auch was geben, das irgendwie Zeiger ist, aber nicht so richtig.
Bei GCC/AVR sollte man es vermeiden, die Adresse von lokalen Variablen zu verwenden. Das zwingt den Compiler nämlich dazu, einen vollständigen Stack-Frame aufzubauen, was recht aufwendig ist. Ausserdem muss er diese Adresse aufwendig berechnen. Wenn man also die Adresse einer Variablen verwendet, dann vorzugsweise von einer globalen oder statischen. Besondern sinnvoll sind Pointer jedoch bei ARM, der sich mit Pointer-relativer Adressierung weit leichter tut als mit absoluter. Auch wenn ich das bislang nicht oft gesehen habe, ist es da auch dienlich, die Bereiche der Steuerregister von I/O-Modulen jeweils zu structs zusammenzufassen, statt jedes Register einzeln zu definieren. Es erhöht die Chancen beträchtlich, dass der Compiler anfangs einmal die Basisadresse des betreffenden I/O-Moduls läd und danach relativ dazu adressiert, statt jedes einzelne Mal aufwendig die Adresse zu laden. Wenn er dazu keine Lust haben sollte, man kann zudem mühelos per expliziter relativer Adressierung nachhelfen. Diese Deklarationstechnik erleichtert ausserdem generische Routinen, beispielsweise wenn man den gleichen Code für mehrere gleichartige UARTs benutzen will. Dies gilt hier auch für AVR oder MSP430, da auch die ganz gut relativ adressieren können - 8051 und PIC tun sich damit schwerer.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.