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?
Kompilieren mit -Os oder -O2 / -O3 ?
- peschmae
- Beiträge: 4844
- Registriert: 07.01.2003 12:50:33
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: nirgendwo im irgendwo
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).Joghurt hat geschrieben:Natürlich O2, von mir aus auch O3
Os optimiert auf kleine Größe, nicht auf Geschwindigkeit
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
-
- Beiträge: 16
- Registriert: 19.11.2005 12:17:07
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
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
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
(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.
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
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
Code: Alles auswählen
-O2 -march=pentium-mmx -fomit-frame-pointer -pipe -fbranch-probabilities
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.
- godsmacker
- Beiträge: 902
- Registriert: 16.03.2003 21:50:26
- Lizenz eigener Beiträge: Artistic Lizenz
- Wohnort: Chemnitz
-
Kontaktdaten:
Nicht zu vergessenJoghurt hat geschrieben:Besonders beliebt sind dort Flags wie "-fproduce-broken-code -fcrash-and-burn -minvalid"peschmae hat geschrieben:Für Details fragst du am besten die Gentooler, die verbrignen ihre Tage mit Compilerflagbasteln
Code: Alles auswählen
--fuck-upstream --omg-optimized --teach-me-unix
http://funroll-loops.org/
-Flo