Wird der Compiler das Entweichen einer inneren Schleife optimieren?

7

Der Code, den ich habe, sieht so aus (alle Verwendungen von done):

%Vor%

wird jeder Compiler es zu diesem konvertieren:

%Vor%

Hinweis: Während ich mich hauptsächlich dafür interessiere, dass if(done)break; umgangen und als toter Code entfernt wird, interessiert mich auch, ob es und done komplett entfernt werden.

    
BCS 16.06.2010, 01:18
quelle

4 Antworten

14

Offensichtlich hängt das vom Compiler ab. Wenn Sie sich nicht sicher sind, sollten Sie am besten die Assembly-Ausgabe des Compilers anzeigen (alle gängigen Compiler haben dafür einen Schalter). Auch wenn Sie mit der Assembly nicht vertraut sind, können Sie die Debug-Version zumindest mit der optimierten Version vergleichen.

Dies gesagt, ist dies eine der wenigen Situationen, in denen goto keine schlechte Idee ist . Fühlen Sie sich frei, es aus inneren Schleifen zu brechen.

Bearbeiten

Habe gerade in VS2010 Folgendes versucht und es optimiert tatsächlich die äußere Bedingung:

%Vor%     
Cogwheel 16.06.2010, 01:21
quelle
7

GNU-Compiler macht genau das, beginnend mit der Optimierungsstufe -O1 (ich benutze gcc 4.5.1 auf x86_64)

%Vor%

wobei .L14 die Beschriftung ist, die genau dort platziert wurde, wo Sie __done:

platziert haben

Eine bessere Frage könnte sein: welcher moderne Compiler führt diese Optimierung nicht durch?

    
Cubbi 16.06.2010 01:31
quelle
4

Ich versuche nicht, snarky zu sein, aber ... ist es wichtig? Im Allgemeinen denke ich, dass es am besten ist, Compiler zu ihrem Job zu lassen, und dieser Job besteht darin, den "besten" (kompilierten) Code, der Ihrem Quellcode entspricht, zu erstellen (beachten Sie, dass "am besten" je nach Ihren Bedürfnissen variieren kann). Alle Leistungsaspekte in Ihrem Code sollten mit einem Profiler und guten Arbeitskenntnissen in Bezug auf algorithmische Komplexität identifiziert werden.

Wenn Sie nur neugierig sind, ignorieren Sie diesen Kommentar. Aber wenn Sie Ihren Code irgendwie optimieren möchten, dann gibt es meiner Meinung nach viel bessere Möglichkeiten.

    
kidjan 16.06.2010 02:04
quelle
1

Ich habe GCC 4.2.1 mit folgendem versucht:

%Vor%

... und es fällt direkt auf postamble mit -O3 :

%Vor%

*** Dies ist von einer nicht verknüpften Objektdatei, call 34 ist eigentlich Aufruf von foo .

    
Alex B 16.06.2010 01:50
quelle