Forum: Mikrocontroller und Digitale Elektronik Wie lange dauert ein Funktionsaufruf?


von Daniel B. (scheinleistung)


Lesenswert?

Hallo zusammen,

Ich frage mich gerade, wieviel Takte ich "verbrate" wenn ich ein Stück 
QuellCode nur der Übersicht halber in Funktionen auslagere? Weis das 
jemand?

Ist es in C möglich eine Funktion inline zu deklarieren, sodass die 
Funktion also eigentlich gar keine ist sonder der Compiler den Funktions 
Code an die entsprechenden Stellen einfach einfügt?

von Quentchen (Gast)


Lesenswert?

In der Tat braucht ein Funktionsaufruf Zeit. Wieviel muss man im 
Assemblerlisting nachschauen. Hängt vom Prozessor und anderen Faktoren 
ab.

Das ist immer ein Tradeoff zwischen Code-Grösse und Ausführungszeit.
"inline" ist ja mittlerweile ein Schlüsselwort in C als type modifier. 
Das kannst Du (nur) auf Funktionen anwenden.

Ob sich das lohnt kann Dir nur ein profiling sagen.

von Peter (Gast)


Lesenswert?

> Ich frage mich gerade, wieviel Takte ich "verbrate" wenn ich ein Stück
> QuellCode nur der Übersicht halber in Funktionen auslagere? Weis das
> jemand?
nein das weiss niemand, weil es jedesmal anders ist. Der eigentliche 
Funktionsaufruf dauert bloss 2Takte (glaube ich) aber dazu kommt noch 
der Variable Teil. Jedes Register was in der funktion verwendet wird 
muss auf dem Stack gesichert werden, die Funktionsparameter werden auf 
dem STack übergeben usw.

man kann es nicht pauschal sagen.

von Daniel B. (scheinleistung)


Lesenswert?

Ahhh okay das klingt logisch. Dann werd ich mal versuchen herauszufinden 
wie das bei einem ATMEGA ist.

von Gast (Gast)


Lesenswert?

Oftmals spart das sogar Zeit. Einfach deshalb weil die Optimierung des 
Compilers mit kleinen Programmstücken besser klarkommt.

von Peter (Gast)


Lesenswert?

> Oftmals spart das sogar Zeit. Einfach deshalb weil die Optimierung des
> Compilers mit kleinen Programmstücken besser klarkommt.
hast du dafür einen Link wo man das nachlesen kann? Normalerweise sollte 
sich grosse blöcke besser optimeren lassen weil da mehr spielraum 
vorhanden ist.

a = b + 1
lässt sich nicht optimieren


a = b + 1
a = a * 2
a = a - 2
lässt sich schon besser optimieren
 a = b * 2

von Daniel B. (scheinleistung)


Lesenswert?

Achwas, das freut mich, ich lagere nämlich gerne alles in Funktionen aus 
;-)) Ist einfach übersichtlicher und auch nachträglich besser lesbar.

von (prx) A. K. (prx)


Lesenswert?

D. Berg schrieb:

> Ich frage mich gerade, wieviel Takte ich "verbrate" wenn ich ein Stück
> QuellCode nur der Übersicht halber in Funktionen auslagere? Weis das
> jemand?

Im Idealfall ist das gratis. Denn wenn du Code wie beschrieben in eine 
nur an einer einzigen Stelle verwendete Funktion auslagerst und diese 
Funktion konsequenterweise als "static" deklarierst, dann wird zumindest 
GCC diesen ausgelagerten Code bei der Codeerzeugung gleich wieder 
einlagern und garkeine separate Funktion erzeugen.

von (prx) A. K. (prx)


Lesenswert?

Manchmal lässt sich Code durch (ggf. erzwungenes) Auslagern sogar 
beschleunigen. Nämlich dann wenn es sich dabei um einen Codezweig 
handelt, der viele Resourcen (Register,Stack) belegt aber nur selten 
beansprucht wird. Dann kann es sein, dass der Wasserkopf der 
Hauptfunktion durch die Auslagerung deutlich reduziert wird.

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
Noch kein Account? Hier anmelden.