static oder nicht static das ist hier die frage



  • Ich denke mal, die static Deklaration könnte einen Vorteil bringen, weil
    der Stack nicht immer wieder neu gebildet werden muss.



  • kuckuck schrieb:

    Eine Funktion wird ganz oft aufgerufen.
    In der Funktion ist eine Variable deklariert.

    Zur Parameter übergabe oder nur ne lokale Variable?



  • dirty old town schrieb:

    Zur Parameter übergabe oder nur ne lokale Variable?

    Eine lokale Variable.



  • kuckuck schrieb:

    dirty old town schrieb:

    Zur Parameter übergabe oder nur ne lokale Variable?

    Eine lokale Variable.

    Dann könnte es sogar langsamer werden, falls der Compiler ein Register dafür nimmt und nicht den Stack.



  • dirty old town schrieb:

    Dann könnte es sogar langsamer werden, falls der Compiler ein Register dafür nimmt und nicht den Stack.

    Soviel ich weiss, werden statische Variable im Datensegment gespeichert und nicht in Registern.



  • darum könnte es langsamer werden



  • Und warum ?
    Eine statische Variable hat doch eine feste Adresse im Datensegment ( also im Arbeitsspeicher ).
    Beim ersten Funktionsaufruf wird sie ins Datensegment geschrieben und bleibt dort auch nach dem Verlassen der Funktion stehen.

    Eine nicht statische Variable muss aber beim Funktionsaufruf erst auf den Stack gepackt werden, der Stackpointer muss gesetzt werden. Beim Verlassen der Funktion wird der Stack wieder abgeräumt, indem der Stackpointer neu gesetzt wird.

    Das dürfte doch länger dauern.



  • Kuckuck !

    Bei einer Variable fällt das noch nicht so ins Gewicht.
    Bei mehreren Variablen ist die statische Version deutlich schneller.



  • Hast du das gemessen?



  • und sobald wer 2 threads hat ist alles im anus



  • Bashar schrieb:

    Hast du das gemessen?

    Ja, mit 5 lokalen Integer-Variablen. Das Verhältnis statisch/nicht-statisch war ca. 0,6

    zjzjzz schrieb:

    und sobald wer 2 threads hat ist alles im anus

    Jo, bei Threads muss man aufpassen.

    Edit: vielleicht sollte ich noch erwähnen, das die Funktionen bei der Messung jeweils 10 Millionen mal aufgerufen wurden.



  • Mit Compileroptimierungen oder ohne? Mit welchem Compiler? Kann man den generierten Code mal sehen?



  • kuckuck schrieb:

    Eine nicht statische Variable muss aber beim Funktionsaufruf erst auf den Stack gepackt werden, der Stackpointer muss gesetzt werden. Beim Verlassen der Funktion wird der Stack wieder abgeräumt, indem der Stackpointer neu gesetzt wird.

    Den Stack-Frame mußt du sowieso anpassen, schon für die Rücksprungadresse und die Funktionsparameter - da macht es nicht viel Unterschied, ob du den Stack-Pointer 16 Byte weiterschiebst oder 50 Byte. Das einzige, was einen Unterschied machen könnte, ist die Initialisierung der beteiligten Variablen (lokal: bei jedem Aufruf/statisch: nur im ersten Durchgang) und (in C++) die Destruktor-Aufrufe am Funktionsende.

    Aber da ist es eine Frage der Semantik, ob sich dieser Unterschied lohnt - wenn du die Variable sowieso bei jedem Aufruf neu verwerten willst, ist es egal, ob der alte Inhalt am Funktionsende oder beim nächsten Funktionsaufruf entsorgt wird.



  • CStoll schrieb:

    Das einzige, was einen Unterschied machen könnte, ist die Initialisierung der beteiligten Variablen (lokal: bei jedem Aufruf/statisch: nur im ersten Durchgang) und ...

    lokal: nur wenn die variablen absichtlich initialisiert werden.
    statisch: vor dem ersten durchgang.

    CStoll schrieb:

    ... (in C++) die Destruktor-Aufrufe am Funktionsende.

    die können wir uns zum glück sparen 😉



  • kuckuck schrieb:

    Und warum ?
    Eine statische Variable hat doch eine feste Adresse im Datensegment ( also im Arbeitsspeicher ).
    Beim ersten Funktionsaufruf wird sie ins Datensegment geschrieben und bleibt dort auch nach dem Verlassen der Funktion stehen.

    Eine nicht statische Variable muss aber beim Funktionsaufruf erst auf den Stack gepackt werden, der Stackpointer muss gesetzt werden. Beim Verlassen der Funktion wird der Stack wieder abgeräumt, indem der Stackpointer neu gesetzt wird.

    Das dürfte doch länger dauern.

    Ja, aber wenn es sich bei der lokalen Variable z.B. um ein int für eine Schleife handelt, kann es sein, dass der Compiler ein Register dafür nimmt und das ist schneller als static Zeugs.



  • Bashar schrieb:

    Mit Compileroptimierungen oder ohne? Mit welchem Compiler? Kann man den generierten Code mal sehen?

    Ich habe es im Debug-Modus gemessen. Das war wohl keine gute Idee.
    Die Release-Version liefert ganz andere Ergebnisse, da gibt es bei 5 Variablen keine gravierenden Unterschiede.


Anmelden zum Antworten