Würde der Compiler die bedingte Anweisung in der Schleife optimieren, indem er sie außerhalb der Schleife verschiebt?

7

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:

%Vor%     
solomon_wzs 13.06.2013, 09:34
quelle

3 Antworten

15

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.

    
Shahbaz 13.06.2013, 09:38
quelle
2

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

aufrufen     
pinkpanther 13.06.2013 09:41
quelle
2

In solchen Situationen finde ich diese Website Ссылка ziemlich nützlich

    
dario minonne 13.06.2013 09:51
quelle

Tags und Links