Wird eine leere for-Schleife, die als Schlaf verwendet wird, weg optimiert?

7

Ich schaue mir einen Code an, der überprüft werden muss, und bin auf ein hektisches Warten gestoßen:

%Vor%

Ich erinnere mich zu lesen, dass diese leeren Schleifen weg optimiert werden können. Würde das hier geschehen oder könnte das funktionieren?

    
Firedragon 24.04.2012, 14:41
quelle

5 Antworten

12

Sie sind dem Compiler ausgeliefert. In der Tat, wenn es schlau ist, wird es erkennen, dass es ein Noop ist. Übrigens hat Neil Butterworth einen netten Post, wo er auch anklickt dieses Thema.

    
cnicutar 24.04.2012, 14:42
quelle
13
___ answer10300269 ___

Sie sind dem Compiler ausgeliefert. In der Tat, wenn es schlau ist, wird es erkennen, dass es ein Noop ist. Übrigens hat Neil Butterworth einen netten Post, wo er auch anklickt dieses Thema.

    
___ antwort10300566 ___

Es ist etwas schrecklich nicht tragbar.

In einigen Compilern kann einer von diesen funktionieren (aber Sie müssen überprüfen, ob die volle Optimierung aktiviert ist, die leere Anweisung wird möglicherweise verworfen):

%Vor%

oder:

%Vor%

Wenn Sie Glück haben, dann kann Ihr Compiler ein Makro oder eine intrinsische Funktion bereitstellen, die zur Assembleranweisung volatile kompiliert wird, etwas wie avr-gcc in MSVC.

Als letzte Ressource können Sie einfach eine einzelne Assembly-Anweisung (es ist Compiler-abhängig, es kann __asm ​​oder etwas ähnliches sein) ausführen ... nichts, wie folgt:

%Vor%

oder (überprüfen Sie Ihre Compiler-Dokumentation):

%Vor%

BEARBEITEN
Wenn Sie keine Anweisung util/delay.h haben und keinen Assembler-Code hinzufügen können (es tut mir leid, welche Art von Compiler Sie verwenden?), Können Sie sich darauf verlassen, dass eine Anweisung mit einem Nebeneffekt dies nicht tut weg optimiert werden (oder, wie von @ouah gepostet, ein Zugriff auf eine Variable, die als %code% deklariert wurde).

    
___ antwort10300748 ___

Die Antwort ist ja, der Compiler kann die Schleife optimieren.

Verwenden Sie das Qualifikationsmerkmal %code% , um die Optimierung zu vermeiden:

%Vor%

Wenn Sie in der eingebetteten Welt programmieren, lesen Sie die Dokumentation Ihres Compilers, da sie normalerweise Verzögerungsfunktionen bereitstellen, die auf eine bestimmte Anzahl von Zyklen oder Mikrosekunden warten, die im Parameter übergeben wurden.

Zum Beispiel hat %code% die folgende Funktion in %code% :

%Vor%     
___ qstntxt ___

Ich schaue mir einen Code an, der überprüft werden muss, und bin auf ein hektisches Warten gestoßen:

%Vor%

Ich erinnere mich zu lesen, dass diese leeren Schleifen weg optimiert werden können. Würde das hier geschehen oder könnte das funktionieren?

    
___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ answer10300371 ___

Einige Compiler, wie gcc, werden feststellen, dass es eine leere for-Schleife ist und pessimize dafür, mit der Erwartung, dass Sie es als eine Delay-Schleife einfügen. Sie können mehr darüber in Ссылка

lesen

Beachten Sie, dass dies compilerspezifisch ist, also zählen Sie nicht mit allen Compilern darauf.

    
___ qstnhdr ___ Wird eine leere for-Schleife, die als Schlaf verwendet wird, weg optimiert? ___ answer31072269 ___

Nichts im Sprachstandard verbietet es, also können Compiler es tun, wenn sie dazu in der Lage sind.

Lassen Sie uns GCC 4.8 dekompilieren, um zu sehen, was es macht

Eingabecode:

%Vor%

Kompilieren und dekompilieren:

%Vor%

Ausgabe:

%Vor%

Die Schleife ist da: Das %code% springt zurück.

Mit %code% :

%Vor%

was nur 0 zurückgibt. Also wurde es komplett weg optimiert.

Dieselbe Analyse kann für jeden Compiler durchgeführt werden.

Siehe auch

___
ouah 24.04.2012 15:08
quelle
4
___ answer10300269 ___

Sie sind dem Compiler ausgeliefert. In der Tat, wenn es schlau ist, wird es erkennen, dass es ein Noop ist. Übrigens hat Neil Butterworth einen netten Post, wo er auch anklickt dieses Thema.

    
___ antwort10300566 ___

Es ist etwas schrecklich nicht tragbar.

In einigen Compilern kann einer von diesen funktionieren (aber Sie müssen überprüfen, ob die volle Optimierung aktiviert ist, die leere Anweisung wird möglicherweise verworfen):

%Vor%

oder:

%Vor%

Wenn Sie Glück haben, dann kann Ihr Compiler ein Makro oder eine intrinsische Funktion bereitstellen, die zur Assembleranweisung nop kompiliert wird, etwas wie __noop in MSVC.

Als letzte Ressource können Sie einfach eine einzelne Assembly-Anweisung (es ist Compiler-abhängig, es kann __asm ​​oder etwas ähnliches sein) ausführen ... nichts, wie folgt:

%Vor%

oder (überprüfen Sie Ihre Compiler-Dokumentation):

%Vor%

BEARBEITEN
Wenn Sie keine Anweisung noop haben und keinen Assembler-Code hinzufügen können (es tut mir leid, welche Art von Compiler Sie verwenden?), Können Sie sich darauf verlassen, dass eine Anweisung mit einem Nebeneffekt dies nicht tut weg optimiert werden (oder, wie von @ouah gepostet, ein Zugriff auf eine Variable, die als volatile deklariert wurde).

    
___ antwort10300748 ___

Die Antwort ist ja, der Compiler kann die Schleife optimieren.

Verwenden Sie das Qualifikationsmerkmal %code% , um die Optimierung zu vermeiden:

%Vor%

Wenn Sie in der eingebetteten Welt programmieren, lesen Sie die Dokumentation Ihres Compilers, da sie normalerweise Verzögerungsfunktionen bereitstellen, die auf eine bestimmte Anzahl von Zyklen oder Mikrosekunden warten, die im Parameter übergeben wurden.

Zum Beispiel hat %code% die folgende Funktion in %code% :

%Vor%     
___ qstntxt ___

Ich schaue mir einen Code an, der überprüft werden muss, und bin auf ein hektisches Warten gestoßen:

%Vor%

Ich erinnere mich zu lesen, dass diese leeren Schleifen weg optimiert werden können. Würde das hier geschehen oder könnte das funktionieren?

    
___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ answer10300371 ___

Einige Compiler, wie gcc, werden feststellen, dass es eine leere for-Schleife ist und pessimize dafür, mit der Erwartung, dass Sie es als eine Delay-Schleife einfügen. Sie können mehr darüber in Ссылка

lesen

Beachten Sie, dass dies compilerspezifisch ist, also zählen Sie nicht mit allen Compilern darauf.

    
___ qstnhdr ___ Wird eine leere for-Schleife, die als Schlaf verwendet wird, weg optimiert? ___ answer31072269 ___

Nichts im Sprachstandard verbietet es, also können Compiler es tun, wenn sie dazu in der Lage sind.

Lassen Sie uns GCC 4.8 dekompilieren, um zu sehen, was es macht

Eingabecode:

%Vor%

Kompilieren und dekompilieren:

%Vor%

Ausgabe:

%Vor%

Die Schleife ist da: Das %code% springt zurück.

Mit %code% :

%Vor%

was nur 0 zurückgibt. Also wurde es komplett weg optimiert.

Dieselbe Analyse kann für jeden Compiler durchgeführt werden.

Siehe auch

___
Adriano Repetti 24.04.2012 14:59
quelle
2

Einige Compiler, wie gcc, werden feststellen, dass es eine leere for-Schleife ist und pessimize dafür, mit der Erwartung, dass Sie es als eine Delay-Schleife einfügen. Sie können mehr darüber in Ссылка

lesen

Beachten Sie, dass dies compilerspezifisch ist, also zählen Sie nicht mit allen Compilern darauf.

    
chmeee 24.04.2012 14:47
quelle
2

Nichts im Sprachstandard verbietet es, also können Compiler es tun, wenn sie dazu in der Lage sind.

Lassen Sie uns GCC 4.8 dekompilieren, um zu sehen, was es macht

Eingabecode:

%Vor%

Kompilieren und dekompilieren:

%Vor%

Ausgabe:

%Vor%

Die Schleife ist da: Das jle springt zurück.

Mit -O3 :

%Vor%

was nur 0 zurückgibt. Also wurde es komplett weg optimiert.

Dieselbe Analyse kann für jeden Compiler durchgeführt werden.

Siehe auch

quelle

Tags und Links