mikrocontroller.net

Forum: Compiler & IDEs AVR-GCC Optimierungen


Autor: tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Es gibt ja die Optimierungen -O0, -O1, -O2, -O3, -Os.

Dabei bedeutet -O0 ja keine Optimierung.
-Os steht für Optimierung der Codegröße.

Sind -O1 bis -O3 dann nur 3 Abstufungen von Optimierungen die nicht auf 
Codegröße sondern auf Laufzeit optimieren?

Wäre es dann sinnvoll immer -O3 zu verwenden, solange der Code dann noch 
in den Speicher passt? Wenn nicht dann halt mit -O2 oder -O1?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tobi schrieb:

> Sind -O1 bis -O3 dann nur 3 Abstufungen von Optimierungen die nicht auf
> Codegröße sondern auf Laufzeit optimieren?

Korrekt.

> Wäre es dann sinnvoll immer -O3 zu verwenden, solange der Code dann noch
> in den Speicher passt? Wenn nicht dann halt mit -O2 oder -O1?

Diese Optimierungsgrade ergeben bei x86 oder PowerPC Sinn. Bei AVRs 
wirst du feststellen, dass bei -O2 oder -O3 gegenüber -Os zwar der Code 
gewaltig anwächst, die Laufzeitgewinn aber minimal ist, oder manchmal 
auch ins Gegenteil umschlägt.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist schwer zu beantworten und muss im Einzelfall entschieden werden. 
Oft, aber auch nicht immer, ist der kürzere Code auch der schnellere. 
Aber das muss nicht so sein (zb inlineing läuft manchmal/meistens 
speichermässig in die Gegenrichtung, je nachdem wie lang die Funktionen 
wirklich sind)
Wenns auf die letzten Taktzyklen ankommt, bzw. aufs letzte Byte das man 
aus dem Speicher rausquetschen muss, dann gibt es sowieso nur eines: 
ausprobieren.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wenn man es ganz genau haben will, sind die -O... ohnehin
irgendwelche all-inclusive-Pakete, von denen keines wirklich
optimal sein muss.

Will man wirklich das Optimum haben, muß man die ganzen
-f...-Optionen von Hand ausprobieren. Bestimmte Kombinationen
davon sind dann die -O...-Optionen.

Autor: tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schade dann werd ich es wohl bei -Os belassen. Grade mal ein klein wenig 
getestet und bei -O3 ist anscheinend der 'best case' besser aber auch 
der 'worst case' schlechter als bei -Os.

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der best case ist bei jeder Optimierungsstufe immer besser als bei allen 
anderen und der Worst Case immer schlechter als bei allen anderen. Liegt 
daran, dass der Optimierer heuristisch arbeitet, d.h. Sachen macht, die 
typischerweise das Programm schneller (bzw. bei -Os kleiner) machen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der mechatroniker schrieb:
> Der best case ist bei jeder Optimierungsstufe immer besser als bei allen
> anderen und der Worst Case immer schlechter als bei allen anderen.

Nö, das immer stimmt nicht.
Ein Beispiel ist der AVR-GCC, er erzeugt gerne unnötig großen und 
langsamen Code.
Z.B. denkt er, daß ein Postincrement (LD Rd,Z++) extrem langsam und 
codefressend sei und ersetzt es durch LD + ADIW + RJMP, also 4 Zyklen je 
Schleifendurchlauf und 4 Bytes mehr.

Die Optimierungen der Laufzeit haben oft nur lächerlich geringe 
Auswirkungen gegenüber -Os (<1%).
Ich habe noch kein Programm gesehen, was von den Laufzeitoptimierungen 
-O1..3 merkbar profitiert. Manchmal erzeugen sie sogar langsameren Code, 
als -Os.
Eigentlich kann man nur sagen, daß -O1..3 nie kleiner compiliert, als 
-Os.


Peter

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, war etwas schlecht ausgedrückt. Best Case und immer ist 
strenggenommen eh ein Widerspruch. Ersetze im Satz "immer" durch 
"prinzipbedingt", dann stimmts.

> Manchmal erzeugen sie sogar langsameren Code,
> als -Os.

Das liegt eben an den Heuristiken, da haben wir den Worst Case.

> Eigentlich kann man nur sagen, daß -O1..3 nie kleiner compiliert, als
> -Os.

Kleiner ist bei -O1..3 ja auch nicht das Ziel. Ok, das ist eine 
Einschränkung zu dem, was ich behauptet habe.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.