Hier ist der C-Code:
%Vor% Ich habe gcc verwendet, um diesen Code zu kompilieren. Wenn ich mit -O
kompiliert hätte, würde es die Funktion f
folgendermaßen optimieren:
Das hängt sehr davon ab, wie groß /* code 1 */
ist. Wenn es sehr klein ist, könnte es sein. Aber wenn es etwas über ein paar Zeilen ist, wird es höchstwahrscheinlich nicht. Das Duplizieren einer großen Menge Code für jedes einzelne if
hätte schreckliche Auswirkungen auf die Leistung. In der Tat kann das bei sehr aggressiver Optimierung passieren und schon gar nicht mit -O
. Von der Manpage von gcc
(Hervorhebung von mir):
-O
-O1 ...Mit -O versucht der Compiler die Codegröße und Ausführungszeit zu reduzieren, ohne irgendwelche Optimierungen durchzuführen, die viel Zeit für die Kompilierung benötigen.
Also ist das Reduzieren von Code auch Teil der Optimierung.
-O2 Optimiere noch mehr. GCC führt fast alle unterstützten Optimierungen durch, bei denen kein Kompromiß zwischen Speicherplatz und Geschwindigkeit besteht . Im Vergleich zu -O erhöht sich diese Option sowohl die Kompilierungszeit als auch die Leistung des generierten Codes.
So -O2
würde nicht tun, was Sie wollen.
-O3 Optimiere noch mehr. -O3 schaltet alle Optimierungen ein, die durch -O2 angegeben sind und schaltet auch
-finline-functions
,-funswitch-loops
,-fpredictive-commoning
,-fgcse-after-reload
,-ftree-vectorize
und-fipa-cp-clone
Optionen.
Nun müssen wir uns diese Optionen ansehen, um zu sehen, ob einige von ihnen tun, was Sie wollen:
-funswitch-loops
Verschiebe Zweige mit schleifeninvarianten Bedingungen aus der Schleife, mit Duplikaten der Schleife in beiden Zweigen (modifiziert nach dem Ergebnis der Bedingung).
Voila! Mit -O3
erhalten Sie die gewünschte Optimierung.
Nun, das hängt von vielen Dingen ab.
Da Sie gcc
verwenden, können Sie immer überprüfen, ob es für ein bestimmtes Programm getan hat, indem Sie gcc -o -S fileName.c
In solchen Situationen finde ich diese Website Ссылка ziemlich nützlich
Tags und Links optimization c gcc