Generelle Fragen zu Funktionsaufrufen und mehr

derpi

Mitglied
Hi,
ich habe beim Surfen einen "Code-Schnipsel" gefunden, zu dem ich ein paar generelle Fragen habe. Dazu mal ein bißchen Beispiel-Code, da der "Schnipsel" ca. 400Zeilen hatte. Man nehme an, dass die echten Funktionen und Variablen aussagekräftige Namen haben und man beim Lesen die Aufgabe des Programmteils erkennen kann:
Beispiel 1:
Code:
function RootFunc() 
{
return func1( func2( func3() );func4( func5( func6() );func7();func8() ) ) 
}

Beispiel 2:
Code:
function RootFunc() 
{
var3 = func3()
var2 = func2(var3)
var6 = func6()
var7 = func7()
var8 = func8()
var5 = func5(var6)
var4 = func4(var5;var7;var8)
var9 = func1(var2;var4)

return var9
}

Sooo... jetzt die Fragen (vorrausgesetzt, dass es Programmiersprachenunabhängig gilt):
1. Wie sind die Unterschiede der Beispiele bzgl. Verarbeitunggeschwindigkeit?
2. Wie kann ich mir die Verarbeitungsreihenfolge vorstellen? Soll heißen, wenn ich func1( func2() ) aufrufe, wird dann zuerst Speicher etc. für func1() reserviert und dann erst func2() ausgeführt und der Rückgabewert an func1() übergeben, oder läuft erst func2() ab und danach func1() wird mit dem Rückgabewert von func2() gestartet?
3. Welcher Stil wäre besser? Bsp 1 wäre ja Golf, wobei Bsp 2 etwas zu ausführlich ist, oder?

lg,
derpi
 
Zuletzt bearbeitet:
Der COmpiler kann da je nach Einstellung und art unterschiedlich arbeiten, es gibt bestimm compiler die machen da kein unterscheid, weil sie sowieso nur die register verwenden ... z.B. macht es jedoch ein erheblichen unterschied ob di temporären variablen wirklich speicher auf dem stack verbrauchen oder die ergebnise nur in registern abgelegt werden ... man kann es erzwingen dass die Daten reingeschrieben werden, z.B.: wenn man die variablen als volatile definiert ...
eine konkrete aussage beszüglich speicherverbrauch kann man nicht machen da es halt compiler und compiler-parameterabhängig ist
 
Da muss Ich meinem Vorredner rechtgeben. Guter oder vielmehr "besserer" Stil wäre Beispiel 2. Da dieser bei Aussagekräftigen Funktionsnamen ersichtlicher ist was passiert.
 
Hi,
das bedeutet dann ja, dass Verarbeitungsgeschwindigkeit und Speicherverbrauch reine Konfigurationssache (sowohl des Compilers als auch per Variablendefinition) ist.

Zum Thema Stil wäre also eine Aussage in der Richtung "je besser lesbar, desto besserer Stil" richtig?
Irgendwie finde ich Beispiel 1 eleganter...

Ich bin aber noch Anfänger, da sieht man manche Sachen ja (noch) anders ;-)

Vielen Dank und lg,
derpi
 
Naja wenn Du Dir Beispiel 1 anschaust, erkennst Du auf den ersten Blick was da passiert?! Manchmal lässt sich sowas nicht anderst bewerkstelligen, aber für jemand anderen ist sowas einfach Hölle, wenn er das lesen und verstehen muss.
 
Für dich selber, im ersten Moment ist natürlich Beispiel 1 angenehmer.
Schreibt sich einfach schneller.
Wenn du dir aber dann nach Jahren oder Monaten den Code anguckst, wirst du erheblich länger brauchen, um ihn zu verstehen.
Noch schwerer wird es jemand haben, der den Code nicht selber geschrieben hat. Es kommt nicht gerade selten in Unternehmen vor, dass man sich in einen fremden Code einarbeiten muss und da würdest du Beispiel 1 sicherlich auch verfluchen :)
Deswegen ist Beispiel 2 aus meiner Sicht auch der bessere Stil.
 
Die meisten Sprachen werten Ausrücke von innen nach außen wie in der Algebra aus. Dazu gehören auch Funktionsaufrufe. Würdest du schreiben func1(5 + 3) würde das ja auch keinen Sinn machen Speicher für die Operation und die Operanden zu reservieren.

Wie meine Vorredner schon geschrieben haben, der Compiler macht das meist schon den richtigen Code von selbst daraus. Selbst als Proficoder wirst Du es heute schwer haben den Code noch selbst von Hand zu optimieren, außer sprachspezifische Geschwindigkeitsschwachstellen zu vermeiden. Die meisten modernen Compiler wissen da selbst schon richtig mit umzugehen. Ich würde die Aussage allerdings auf "primitive Operationen" beschränken, bei komplexen Strukturen bei der Objektorientierung kommt es sehr wohl noch auf ein gutes Design an. Da hilft dann auch kein Compiler. Aber das ist ja schließlich auch des Coders Aufgabe ;)
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück