2013-03-21 10 views
9

Die Release Notes für gcc waren ein wenig auf -og vage:gcc -O0 vs. -og Kompilierung

es die Notwendigkeit für schnelle Kompilierung-Adressen und eine bessere Debug-Erfahrung, während ein vernünftiges Maß an Laufzeit bereitstellt Performance. Die Gesamterfahrung für die Entwicklung sollte besser sein als die Standardoptimierungsstufe -O0.

Enthält "Gesamterfahrung für die Entwicklung" die Kompilierzeit? Wenn ich keine Debug-Symbole benötige und mich für die Kompilierzeit optimiere, sollte ich -O0 oder -Og verwenden?

+3

Wenn Sie keine Debugging-Symbole benötigen, sollten Sie -O0 – Akobold

+4

verwenden. Warum nicht einfach den vollständigen Build von * Ihrem Projekt * mit * Ihrem Compiler * mit den verschiedenen Optionen und wählen Sie den schnellsten? – NPE

+0

Wenn Sie nur an einer guten Leistung interessiert sind, ist das normale Niveau O2. O0 ist fast keine Optimierung, und es ist hauptsächlich für das Debugging (z. B. wird es nicht ungenutzten Variablen zu optimieren, wird es nicht verbessern sloppy Codierung, die leicht behoben wird, usw.). – teppic

Antwort

1

Mit -Og muss der Compiler zusätzliche Daten konstruieren und schreiben (für das Debugging), so dass es länger dauern wird. Einfach kompilieren zu Assembler (mit gcc -S -Og, etc) und vergleichen. Aber was für ein Unterschied es zwischen -O0 und -Og Laufzeit ist wahrscheinlich in den Schatten gestellt von der Zeit gcc und seine komplette Maschinen zu starten.

Wenn Sie kompilieren möchten, sollten Sie vielleicht tcc für C in Betracht ziehen. Vielleicht ist LLVM schneller für C++.

+2

Haben Sie Beweise, um Ihre erste Behauptung zu sichern, "mit -Og muss der Compiler extra Daten konstruieren und schreiben (für das Debuggen)"? Das würde nur für die Flags "-g" gelten, wenn ich mich nicht irre. Ein Blick in den GCC 4.9.2 Quellcode ('gcc/opts.c') zeigte, dass' -Og' das gleiche wie '-O1' ist ('/* -Og wählt Optimierungslevel 1. */'), aber mit einigen deaktivierten Flags, die mit '-O1' oder höher aktiviert würden ('OPT_LEVELS_1_PLUS_NOT_DEBUG',' OPT_LEVELS_1_PLUS_SPEED_ONLY' und 'OPT_LEVELS_2_PLUS_SPEED_ONLY'). – Lekensteyn

+1

Ich veröffentlichte eine ausführlichere Antwort hier: http://Stackoverflow.com/a/27076307/427545 – Lekensteyn

1

Enthält "Gesamterfahrung für Entwicklung" Kompilierzeit?

Ich denke, es tut, aber nicht in diesem sehr speziellen Fall.

Wenn ich keine Debugsymbole benötige und mich für die Kompilierzeit optimiere, sollte ich -O0 oder -Og verwenden?

-O0.

0

Wenn ich keine Debug-Symbole brauche und mich für die Kompilierzeit optimiere, sollte ich -O0 oder -Og verwenden?

Wenn das Vorhandensein oder Fehlen von Debug-Symbolen keine Rolle spielt, zeit beide Optionen und sehen, welche schneller ist.