Seite 1 von 1
Compiler-Optionen
Verfasst: Di Okt 11, 2011 8:25 am
von Panke
EDIT by Xin: von Celsius -> Fahrenheit-Programm abgetrennt
Zur Info:
- -Wall Schalte alle Warnungen an. Es ist guter Stil so zu programmieren, dass trotzdem keine Warnungen auftauchen.
- -O3 Höchste Optimierungsstufe. Der g++ garantiert hier glaube ich nimmer, dass der Code das macht was er soll. Dafür ist schnell. Hab ich beim Entwickeln immer aus.
- -o <name> so heißt dein Programm danach.
- -g Debug-Symbols einschalten. Hat man euch beigebracht, was ein Debugger ist?
Ich empfehle auf jeden Fall ein gutes Einsteigerbuch anzuschaffen. Meiner Meinung nach gibt esim Netz (noch) kein Tutorial, dass ein Buch ersetzen könnte.
Gute Bücher sind: "Der C++-Programmierer", "C++ Einführung und professionelle Programmierung", "C++ Lernen und Professionell anwenden",
und das neue von Bjarne, dem Vater von C++:
http://www2.research.att.com/~bs/programming.html
Bitte nichts von Galileo Computing. Diese parallel zu deinem Kurs durchzuarbeiten wird dir im Endeffekt ne Menge Zeit sparen.
Ansonsten: Wer nicht fragt, bleibt dumm.
Re: Celsius -> Fahrenheit-Programm
Verfasst: Mi Okt 12, 2011 2:40 pm
von oenone
Panke hat geschrieben:Zur Info:
- -Wall Schalte alle Warnungen an. Es ist guter Stil so zu programmieren, dass trotzdem keine Warnungen auftauchen.
- -O3 Höchste Optimierungsstufe. Der g++ garantiert hier glaube ich nimmer, dass der Code das macht was er soll. Dafür ist schnell. Hab ich beim Entwickeln immer aus.
Kleine Anmerkung: Optimierungen sollte man immer anschalten, wenn man entwickelt, da dann der Code noch genauer untersucht wird und noch mehr Warnungen ausgespuckt werden, falls vorhanden (z.B. nicht benutzte Variablen oder Variablen, die benutzt werden bevor sie initialisiert werden, werden nur mit Optimierungen verwarnt).
Re: Celsius -> Fahrenheit-Programm
Verfasst: Mi Okt 12, 2011 7:29 pm
von Panke
Das wusst ich gar nicht. Gut zu wissen. Andererseits ist das Verhalten im Debugger bei -O3 nicht immer 100% einsichtig.
Re: Celsius -> Fahrenheit-Programm
Verfasst: Do Okt 13, 2011 9:15 am
von oenone
Naja, -O2 dürfte eigentlich ausreichen. Weitere Optimierungen kann man dann für die Release-Version vornehmen - natürlich testen ob sich das Programm immernoch genauso verhält

Re: Celsius -> Fahrenheit-Programm
Verfasst: So Okt 16, 2011 10:52 am
von fat-lobyte
Panke hat geschrieben:Das wusst ich gar nicht. Gut zu wissen. Andererseits ist das Verhalten im Debugger bei -O3 nicht immer 100% einsichtig.
Nicht nur das, wie ich gesehen habe killt -O3 auch Optimierungen! Durch das inlinen von Funktionen wird der Code größer und wird deshalb langsamer in den L1/L2 (?) Cache geladen. Deswegen sollte man immer, wenn man -O3 verwendet auch -fno-inline mitgeben.
Re: Celsius -> Fahrenheit-Programm
Verfasst: So Okt 16, 2011 11:23 am
von Xin
fat-lobyte hat geschrieben:Panke hat geschrieben:Das wusst ich gar nicht. Gut zu wissen. Andererseits ist das Verhalten im Debugger bei -O3 nicht immer 100% einsichtig.
Nicht nur das, wie ich gesehen habe killt -O3 auch Optimierungen! Durch das inlinen von Funktionen wird der Code größer und wird deshalb langsamer in den L1/L2 (?) Cache geladen. Deswegen sollte man immer, wenn man -O3 verwendet auch -fno-inline mitgeben.
Aus dem Thread lerne ich gerade auch einiges... ^^
Vielleicht könnte man das auch mal in einer Wiki-Seite zusammenfassen?
Re: Celsius -> Fahrenheit-Programm
Verfasst: So Okt 16, 2011 1:33 pm
von MoonGuy
Der Visual Studio 2010 Compiler sagt mir, O1 minimiert die Größe der ausgegebenen Datei so gut es geht und O2 maximiert die Geschwindigkeit so gut es geht. O3 hat man gar nicht implementiert, dafür gibt es Ox, was beides vereinen soll. Bin mir aber nicht sicher, wie sehr man das auf g++ oder minGW Compiler übertragen kann/darf.
Re: Celsius -> Fahrenheit-Programm
Verfasst: Do Okt 20, 2011 11:23 am
von oenone
MoonGuy hat geschrieben:Der Visual Studio 2010 Compiler sagt mir, O1 minimiert die Größe der ausgegebenen Datei so gut es geht und O2 maximiert die Geschwindigkeit so gut es geht. O3 hat man gar nicht implementiert, dafür gibt es Ox, was beides vereinen soll. Bin mir aber nicht sicher, wie sehr man das auf g++ oder minGW Compiler übertragen kann/darf.
-O0 = keine Optimierungen, schnellerer Compile
-Os = möglichst kleines Binary, wie -O2 ohne Optimierungen, die die Größe erhöhen würden
-O/-O1 = weniger Codegröße, schnellere Ausführung: -fauto-inc-dec -fcprop-registers -fdce -fdefer-pop -fdelayed-branch -fdse -fguess-branch-probability -fif-conversion2 -fif-conversion -finline-small-functions -fipa-pure-const -fipa-reference -fmerge-constants -fsplit-wide-types -ftree-ccp -ftree-ch -ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-fre -ftree-sra -ftree-ter -funit-at-a-time
-O2 = stärkeres Optimieren, aber kein loop unrolling oder function inlining; wie -O1, plus: -fthread-jumps -falign-functions -falign-jumps -falign-loops -falign-labels -fcaller-saves -fcrossjumping -fcse-follow-jumps -fcse-skip-blocks -fdelete-null-pointer-checks -fexpensive-optimizations -fgcse -fgcse-lm -foptimize-sibling-calls -fpeephole2 -fregmove -freorder-blocks -freorder-functions -frerun-cse-after-loop -fsched-interblock -fsched-spec -fschedule-insns -fschedule-insns2 -fstrict-aliasing -fstrict-overflow -ftree-pre -ftree-vrp
-O3 = wie -O2, plus: -finline-functions -funswitch-loops -fpredictive-commoning -fgcse-after-reload -ftree-vectorize
fat-lobyte hat geschrieben:Deswegen sollte man immer, wenn man -O3 verwendet auch -fno-inline mitgeben.
Warum? Dann kann man auch gleich -O2 nehmen..
Re: Celsius -> Fahrenheit-Programm
Verfasst: Do Okt 20, 2011 12:37 pm
von fat-lobyte
oenone hat geschrieben:fat-lobyte hat geschrieben:Deswegen sollte man immer, wenn man -O3 verwendet auch -fno-inline mitgeben.
Warum? Dann kann man auch gleich -O2 nehmen..
Richtig. Das sollte man auch machen. Ich habe für ein
kleines Projekt mal nachgemessen, was -O3 und -O2 tut. Mit -O2 wars ungefähr 2-3 mal schneller, mit -O3 wars gleich wie unoptimiert. Mit -O3 und -fno-inline ähnlich wie mit -O2.
Deswegen: BITTE BITTE BITTE finger von -O3 lassen, da es gefährlich ist (in dem Sinne dass es subtile Bugs einbauen kann) und manchmal der Performancegewinn nicht vorhanden ist.
Wenn ihr die Zeit und die Instrumente habt um den Geschwindigkeitsgewinn akkurat zu messen, dann kann man experimentieren. Aber einfach *irgend*ein Optimierungs-flag dazugeben hallte ich für nicht angebracht.