2012-06-07 7 views
11

In Bezug auf Optimierungen durch den Compiler (GCC), was ist die Standardpraxis? Was macht jede Option (-O, -O1, -O2, -O3, -Os, -s, -optimierte Optimierungen) anders und wie entscheide ich, was optimal ist?Wie viel sollte ich optimieren?

+0

http://stackoverflow.com/questions/19689014/gcc-difference-between-o3-and-os || http://stackoverflow.com/questions/11546075/is-optimization-level-o3-dangerous-in-g –

Antwort

8

Normalerweise -O2 ist eine gute Optimierungsstufe, um zuerst zu testen.

Wenn Sie jedoch das bestmögliche Ergebnis erzielen möchten, werden Sie am Ende viele Optimierungsstufen ausprobieren, da Sie nicht im Voraus sagen können, welches Niveau am besten für Ihre App geeignet ist.

Beachten Sie auch, dass die Optimierungsergebnisse mit jeder CPU variieren sollten (bei einigen CPUs kann die Optimierung der Größe möglicherweise eine höhere Geschwindigkeit ergeben als die Optimierung der Geschwindigkeit).

nur für die Zukunft, hier eine kurze Beschreibung jeder Ebene (Sie können die vollständige Beschreibung in der Dokumentation http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html finden):

-O (identisch mit -O1): Mit -O, die Compiler versucht um Code-Größe und Ausführungszeit zu reduzieren, ohne irgendwelche Optimierungen durchzuführen, die viel Zeit für die Kompilierung benötigen.

-O2: Optimieren Sie noch mehr. GCC führt fast alle unterstützten Optimierungen durch, bei denen kein Kompromiss zwischen Speicherplatz und Geschwindigkeit besteht. Im Vergleich zu -O erhöht diese Option sowohl die Kompilierungszeit als auch die Leistung des generierten Codes.

-O3: Noch mehr optimieren. -O3 schaltet alle Optimierungen ein, die durch -O2 spezifiziert sind, und schaltet auch die -Finline-Funktionen ein, -Funswitch-Loops, -fpredictive-commoning, -fgcse-nach-reload, -fotre-vektorize, -ftree-partial-pre und - fipa-cp-clone Optionen.

-Os: Optimize for size.-Os ermöglicht alle -O2-Optimierungen, die die Code-Größe normalerweise nicht erhöhen. Es führt auch weitere Optimierungen durch, um die Code-Größe zu reduzieren.

- Schnell: Die Einhaltung strenger Normen nicht beachten. -Ofast ermöglicht alle -O3-Optimierungen. Es ermöglicht auch Optimierungen, die nicht für alle standardkonformen Programme gültig sind. Es schaltet -ffect-math und die Fortran-spezifischen -nfo-protect-parens und -fstack-arrays ein. Wenn Sie mehrere -O-Optionen mit oder ohne Level-Nummern verwenden, ist die letzte solche Option diejenige, die wirksam ist.

+0

Danke, vor allem für diesen Link. Sehr hilfreich. –

2

Das Linux Kernel Makefile bietet sowohl für -O2 und -Os. Entweder wäre es angebracht, auf weitere Details zu verzichten.

Die -Os optimiert für kleine Speicher. Da CPUs heutzutage erheblich schneller sind als der Hauptspeicher, ist die Optimierung für kleine Speicher auch auf großen Maschinen sinnvoll - jede Zeit, die darauf wartet, dass der Cache aus dem Hauptspeicher gefüllt wird, ist verschwendete Zeit. Machen Sie also den Befehlscache am besten aus, indem Sie für die Platzeffizienz kompilieren und vielleicht wird die Ausführungszeit auch verbessern.

Die -O2 führt alle "üblichen Optimierungen" durch, und die ausgewählten Optimierungen werden sicher sein. (Ich habe gehört, dass einige der -O3 Optimierungen sind nicht immer sicher, aber das kann sein, weil der Linux-Kernel mit einigen Einschränkungen läuft nicht gemeinsam üblichen Anwendungen.)

Die beste Antwort ist natürlich um Ihre Software mit mehreren Optimierungsebenen zu kompilieren; Zeit, wie lange es dauert, die Software zu kompilieren und wie lange es dauert, bis die Software einen repräsentativen Benchmark-Test durchlaufen hat. Messen Sie, wie viel Speicher für alle verwendet wird.

Wählen Sie dann die "beste" Kombination aus Übersetzungsgeschwindigkeit, Laufzeitgeschwindigkeit und Laufzeitspeicher. Sie möchten vielleicht die schnellsten Compiles, oder möchten Sie vielleicht die schnellsten Laufzeiten, oder versuchen Sie, in eine kleinere Menge an Speicher von einem virtuellen Hosting-Anbieter zu passen, um Geld zu sparen.

Es ist wahrscheinlich fair, nur -O2 ohne Messungen zu wählen.