Nur so aus Neugier, ist so ein Code nun effizienter als ein langer verschachtelter "wenn>dann" Code?
Was macht der Compiler damit? (Nur ganz grob, Details verstehe ich sowieso noch nicht..)
Nur so aus Neugier, ist so ein Code nun effizienter als ein langer verschachtelter "wenn>dann" Code?
Was macht der Compiler damit? (Nur ganz grob, Details verstehe ich sowieso noch nicht..)
der obfuscated code oben ist sicher nicht "effektiver".
Es gibt bei C aber ein paar Tricks, den Code tatsächlich schneller zu machen:
statt x=x+1
x++
statt x=x+5
x+=5
statt
{
x=2*y;
y++;
}
x=2*y++;
Die Unterschiede sind aber minimal, das meiste macht der C Compiler selbstständig über seine eingebaute Code-Optimierung. Damit man hinterher seinen Code noch selber versteht und Fehler vermeidet, macht es mehr Sinn, ihn intuitiv verständlich zu schreiben.
Quelle? Belege?
Hier der Grund meiner Skepsis deine Behauptung betreffend.
Geändert von Sisor (24.02.2019 um 18:18 Uhr) Grund: Begründung der Skepsis hinzugefügt.
das war zugegebenermaßen aus der Erinnerung aus einem Skript für einen C-Programmierkurs zitiert und bezog sich auf Compiler ohne Optimierung.
IIRC, lautete die Erklärung:
x = x + 1;
würde 3 Instruktionen erfordern, um x zur Addierunit zu schieben, 1 zu addieren und dann wieder x zurückzuschreiben, wähend
x++
direkt im Register, in dem es steht, 1 inkrementiert.
(restliche Beispiele analog)
Falls diese Aussage nicht (mehr) stimmt, lasse ich mich ntl gern korrigieren.
Ok. Die Arduino-Sketche werden mit dem gcc-Flag -Os für optimize size also Programmgrößenoptimierung kompiliert.Falls diese Aussage nicht (mehr) stimmt, lasse ich mich ntl gern korrigieren.
Ohne Optimierung hast du zwar Recht, das deine Beispiele unterschiedlichen Code generieren können.
Dies gilt aber ausdrücklich nicht für Arduino.
danke für die Klarstellung!
Grob gesagt geschehen drei Schritte im Compiler:
1. Frontend, Sprachspezifisch (bei Arduino C++): Code wird gelesen (geparst) und zu einem Syntaxbaum (A-S-T: abstact syntax tree) verarbeitet.
2. Middleend: Sprachunabhängig: A-S-T wird analysiert und optimiert.
3. Backend: Ausführbarer Code (z.B. universeller Bytecode oder CPU-Spezifischer Maschinencode) wird erstellt.
Wow, Danke für die Erleuchtung!
Diese Website "Compiler Explorer" ist mir völlig neu.
Da könnte ich meinen "Umstandscode" also mal reinhauen und schauen, was bei "komprimierte Funktion" steht.
Aber letztendlich kommt der gleiche Maschinencode bei raus? Gut zu wissen.
Ich dachte, mein Anfängercode ist langsamer und größer als einer vom Profi.
Das muss also nicht immer der Fall sein?
Lesezeichen