Dauer funktionsaufruf?



  • Hallo leute,

    dies geht ehr richtung Assambler, aber hat auc hwas mit C zu tun:) Wie lange dauer ein funktionaufruf? Wie stark abhänig ist es von den Übergabeparametern?

    grüße



  • was genau meinst du?

    Wie man eine Funktion aufruft und vor allem, wie man die Parameter setzt, hängt von der Architektur ab. Du musst deine Frage genauer stellen.



  • naja ein funktionauruf ist ja eine sprungbefehl... wie lange dart sowas ?
    die anzahl der funktionsparameter erfroder entsprechende ja stack veränderung stackpointer etc.



  • BorisDieKlinge schrieb:

    naja ein funktionauruf ist ja eine sprungbefehl... wie lange dart sowas ?

    hängt von der Architektur ab. Willst du die Zeit in Millisekunden erfassen, die der Sprung Befehl tatsächlich benötigt? Ansonsten würde ich sagen: so viele Zyklen, wie die Architektur braucht, um einen Befehl zu holen, dekodiedren und auszuführen. 😉

    BorisDieKlinge schrieb:

    die anzahl der funktionsparameter erfroder entsprechende ja stack veränderung stackpointer etc.

    nicht immer.



  • Du meinst, was das Compilat so alles anstellt?
    Wenn Du einen Debugger hat, der auch asm- Code steppen kann, schau's Dir mal selbst an. Ich kann nur sagen, was der NC30 macht:

    1. Der Platz für die Parameter wird angelegt und entsprechend belegt (also entweder Adressen oder Werte) inklusive des Funktionsrückgabewerts. Tatsächlich gilt: Je mehr, desto länger dauert's.
    2. Die Funktion wird angesprungen -> jetzige Adresse + Inkrement auf den Returnstack gelegt.
    3. Die angesprungene Funktion belegt ihren eigenen Frame für lokale Variablen.
    4. Dann erledigt sie eventuelle Vorbelegungen. Auch hier gilt wieder: Je mehr, desto langsamer. Hier kannst Du allenfalls mit static Rechenzeit sparen, aber der Speicher ist dann für andere Funktionen weg.
    5. Die Funktion tut (hoffentlich), was sie soll und legt den Rückgabewert in den Parameterblock des Aufrufers.
    6. Die Funktion gibt ihren Frame zurück (deswegen werden die Variablen ungültig außerhalb der Funktion) und beendet sich mit einem Return. Dabei wird die Adresse vom Returnstack geholt und in den Program Counter geladen, also beim Aufrufer weitergemacht.
    7. Der Aufrufer holt eventuell noch den Rückgabewert und verwirft den Parameterblock.

    Du siehst, es passiert ziemlich viel bei einem Funktionsaufruf. Es gibt noch so Optimierer- Tricks, die einen Teil des Parameterblocks in den Prozessorregistern zu halten versuchen, aber das ist von der Prozessorarchitektur abhängig.

    Reicht das für einen Überblick?



  • wenn funktionsaufrufe nicht erwünscht sind, dann bieten viele compiler die möglichkeit zum 'zwangs-inlinen'. solche microoptimierungen lohnen sich in der regel eher selten, also nur, wenn's wirklich auf einzelne taktzyklen ankommt.
    🙂


Anmelden zum Antworten