Kompilieren mit -Os oder -O2 / -O3 ?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
ConiKost
Beiträge: 268
Registriert: 04.02.2004 20:41:11

Kompilieren mit -Os oder -O2 / -O3 ?

Beitrag von ConiKost » 21.11.2005 09:40:51

Hallo!
Ich besitze hier einen Pentium MMX 233 MHz mit 128MB-RAM

Wenn man auf diesem Rechner kompiliert, sollte ich als optimierungsflag hier lieber -Os oder doch -O2/-O3 nehmen?

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 21.11.2005 17:22:03

Natürlich O2, von mir aus auch O3
Os optimiert auf kleine Größe, nicht auf Geschwindigkeit

-march=pentium-mmx -mmmx sollten meiner Meinung nach auch nicht fehlen. (Ja, es heißt -mmmx)

Benutzeravatar
peschmae
Beiträge: 4844
Registriert: 07.01.2003 12:50:33
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: nirgendwo im irgendwo

Beitrag von peschmae » 21.11.2005 19:19:33

Joghurt hat geschrieben:Natürlich O2, von mir aus auch O3
Os optimiert auf kleine Größe, nicht auf Geschwindigkeit
Naja, da untertreibst du -Os jetzt aber etwas. -Os ist wie -O2 ausser dass es die Optimierungen weglässt die den Coder grösser machen (da kommt mir jetzt spontan loop-unrolling in den Sinn, gibt sicher auch noch andere).
Also nicht "keine Optimierung auf Geschwindigkeit" oder so.

Soviel ich weiss geben sich -Os und -O2 Tempomässig nicht viel (ok Ausnahmen gibts immer).
-O3 ist auch nur bei manchen Programmen schneller als -O2, bei anderen aber auch langsamer soviel ich weiss. Von dem her nimmst du als Default imo am besten -O2, und da -Os nicht viel anders ist kannst du auch das nehmen ;)

Für Details fragst du am besten die Gentooler, die verbrignen ihre Tage mit Compilerflagbasteln ;)

MfG Peschmä
"er hätte nicht in die usa ziehen dürfen - die versauen alles" -- Snoopy

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 21.11.2005 20:43:05

peschmae hat geschrieben:Für Details fragst du am besten die Gentooler, die verbrignen ihre Tage mit Compilerflagbasteln ;)
Besonders beliebt sind dort Flags wie "-fproduce-broken-code -fcrash-and-burn -minvalid" ;)

Mr. Anderson
Beiträge: 16
Registriert: 19.11.2005 12:17:07

Beitrag von Mr. Anderson » 22.11.2005 02:04:17

Hallo,

als einstiger Gentooler kenn ich diese Spiele mit den Flags nur zu genau. :)

Wenn Du keinen abwärtskompatiblen Code brauchst, dann schlage ich Dir vor

Code: Alles auswählen

-O2 -march=pentium-mmx -fomit-frame-pointer -pipe
zu verwenden.

Dies sind Optionen, die in zwei Jahren Gentoo bei mir keine Probleme verursacht haben.

Das -march=pentium-mmx impliziert -mmmx und nutzt den vollen Befehlssatz (Standard ist 386er-kompatibler Code). Läuft stabil und kann auf Pentium-MMX und ab Pentium2 oder AMD K6 oder Cyrix 6x86MX aufwärts ausgeführt werden.

Das -pipe spart Übersetzungszeit. Wenn Du den GNU Assembler verwendest, sollte es damit keine Probleme geben. Der erzeugte Code sollte der gleiche sein wie ohne das Flag.

fomit-frame-pointer knausert etwas mehr mit Registern. Das wird ein Debuggen des Codes wahrscheinlich unmöglich machen, aber das hast Du vermutlich ja sowieso nicht vor. Eventuell fängt das Makefile des Kernels dieses Flag ab. Das würde ich dann auch nicht ändern.

Darüber hinaus holt GCC 3.4 gegenüber GCC 3.3 noch etwas mehr Leistung raus.

Damit hast Du außer in wenigen Spezialfällen mehr als 95% dessen, was mit GCC 3 und seinen Compiler-Optimierungen bei einmaligem Kompilieren an Leistung zu bekommen ist.

Wenn Du keinen besonderen Grund hast, jetzt noch mehr auszureizen, ist das ein Zustand, bei dem es angebracht ist, aufzuhören und sich zufrieden zurückzulehnen.

Wenn Du nun aber aus irgendeinem Grund noch nicht genug hast, dann setze zusätzlich zu den obigen Optionen -fprofile-arcs

Code: Alles auswählen

-O2 -march=pentium-mmx -fomit-frame-pointer -pipe -fprofile-arcs
und arbeite einige Zeit ganz normal mit dem übersetzten Programm (läuft erstmal deutlicher langsamer). Es werden dann Statistiken aufgezeichnet, welche Programmzweige wie oft ausgeführt werden. Hast Du einige Stunden oder länger so damit gewerkelt, kompiliere noch einmal ohne -fprofile-arcs, aber mit -fbranch-probabilities, also

Code: Alles auswählen

-O2 -march=pentium-mmx -fomit-frame-pointer -pipe -fbranch-probabilities
(dazu bitte aber die Hinweise der manpage beachten)

So, und alles, was darüber hinaus geht, ist von Abfall. -O3 verschlingt viel Übersetzungszeit und bringt insbesondere auf älteren Rechnern wie Deinem Pentium MMX tendenziell schlechtere Ergebnisse. Irgendwelche Flags, die nun noch nicht implizit oder explizit gesetzt sind, bringen nur in Ausnahmefällen Vorteile oder neigen dazu fehlerhaften oder instabilen Code zu erzeugen. Es lohnt sich nicht, noch mehr Zeit zu investieren. (Ich weiß, wovon ich rede) Für einzelne Programme mag es noch möglich sein, ein paar Prozent rauszukitzeln, aber systemweite Geschwindigkeitssteigerungen mit weiteren Compiler-Optionen sind nur noch in umfassenden Benchmarks messbar.

Achja: Bei größeren Programmen (zum Beispiel X) lohnt es sich, das auf nem schnelleren Rechner zu kompilieren. Mit obigen Einstellungen (ohne fprofile-arcs) kannst Du auf der alten Mühle mit über 10 Stunden rechnen.

Benutzeravatar
godsmacker
Beiträge: 902
Registriert: 16.03.2003 21:50:26
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: Chemnitz
Kontaktdaten:

Beitrag von godsmacker » 23.11.2005 03:03:17

Joghurt hat geschrieben:
peschmae hat geschrieben:Für Details fragst du am besten die Gentooler, die verbrignen ihre Tage mit Compilerflagbasteln ;)
Besonders beliebt sind dort Flags wie "-fproduce-broken-code -fcrash-and-burn -minvalid" ;)
Nicht zu vergessen

Code: Alles auswählen

--fuck-upstream --omg-optimized --teach-me-unix
und einige andere.

http://funroll-loops.org/

-Flo

Antworten