Link Time Optimization
-
Hallo!
In Anlehnung an diesen Thread hier noch einmal allgemein die Frage:
- Wie gut ist mittlerweile die Umsetzung von LTO bei den Compilern (vor allem VS2010 und GCC)? Kann davon ausgegangen werden, dass die LT-Optimierungen genauso gut sind wie die Optimierungen, die stattfinden würden, wenn sich alle Funktionen in einem Modul befinden würden? Wie sind eure Erfahrungen?
- Wie sollten nach heutigem Stand der Technik Getter und Setter programmiert werden? Inline in der Header-Datei oder als ganz normale Funktion in der cpp-Datei, da der Compiler das Inlinen sowieso durchführt?
- Bietet LTO irgendwelche Nachteile (abgesehen natürlich von der längeren Linkzeit)?
Grüße
-
zu 1.
Beim Compiler von Microsoft wird (lt. einem technischen Papier, welches ich leider gerade nicht finde) bei Anwendung der LTO der komplette AST in das Objekt gepackt, sprich, es wird eigentlich nur geparsed und erst beim Linken wirklich optimiert und dann kompiliert. Die Güte der Optimierungen dürfte damit identisch sein zu der, die bei der "altmodischen" Kompilierung stattfindet. Die Tragweite ist natürlich entsprechend größer.Der GCC wird es auch nicht anders machen.
zu 3.
Ein Nachteil könnte größerer Output sein, wegen der um ein vielfaches besseren Inlining-Möglichkeiten. Wenn man das als Nachteil sehen möchte.
-
Bloops schrieb:
[*]Wie sollten nach heutigem Stand der Technik Getter und Setter programmiert werden? Inline in der Header-Datei oder als ganz normale Funktion in der cpp-Datei, da der Compiler das Inlinen sowieso durchführt?
Ich schreibe solche kurzen Funktionen immer in die Header, weil es dem Compiler dann leicht fällt diese auch ohne spezielle Einstellungen zu optimieren. Von LTO halte ich nämlich nicht so viel. Wenn man Getter, Setter und andere kurze Funktionen nämlich schon inline hat sind die wichtigsten Optimierungsschritte schon getan. Ich habe jedenfalls noch nie messbare Geschwindigkeitssteigerungen durch LTO erlebt. Dafür wird aber die Gesamtbuildzeit pervers hoch.
-
Ich verwende bei jedem Projekt LTO/LTCG.
Warum? Weil es micht nicht schert zu überlegen was/wo von Inlining profitieren könnte. Und weil der Compiler sowieso schlauer ist als ich.Getter/Setter schreib' ich trotzdem oft in die Header-Datei. Hat aber mehr mit Faulheit als mit was anderem zu tun.
Ausnahme sind gemeinsam genutzte Libraries die ich entwickle/warte, da schreib ich bis auf Templates alles in die .cpp Files, da ich die Header-File "sauber" halten möchte.
-
Vielen Dank euch für die Antworten! Mir würde jetzt auch kein Grund einfallen, warum man nicht zumindest im Release-Build LTO aktivieren sollte.
SeppJ schrieb:
Ich schreibe solche kurzen Funktionen immer in die Header, weil es dem Compiler dann leicht fällt diese auch ohne spezielle Einstellungen zu optimieren.
hustbaer schrieb:
Getter/Setter schreib' ich trotzdem oft in die Header-Datei.
Schreibt ihr die Funktionsdefinition dann direkt in die Klassendefinition, also
class A { public: double val() { return val_; } private: double val_; };oder der Übersichtlichkeit halber doch getrennt (wenn auch im selben file)
class A { public: double val(); private: double val_; }; inline double A::val() // mit oder ohne "inline"? Compiler macht ja eh, was er will ;) { return val_; }?
Grüße
-
Wofür soviel Platz verschenken?
class A { public: double val() { return val_; } private: double val_; };Ist gut für die Schreibfaulen und für die Übersichtlichkeit.
-
Bloops schrieb:
Vielen Dank euch für die Antworten! Mir würde jetzt auch kein Grund einfallen, warum man nicht zumindest im Release-Build LTO aktivieren sollte.
SeppJ schrieb:
Ich schreibe solche kurzen Funktionen immer in die Header, weil es dem Compiler dann leicht fällt diese auch ohne spezielle Einstellungen zu optimieren.
hustbaer schrieb:
Getter/Setter schreib' ich trotzdem oft in die Header-Datei.
Schreibt ihr die Funktionsdefinition dann direkt in die Klassendefinition, also
class A { public: double val() { return val_; } private: double val_; };oder der Übersichtlichkeit halber doch getrennt (wenn auch im selben file)
In Projekten wo ich es aus "Faulheit" mache immer so.
class A { public: double val(); private: double val_; }; inline double A::val() // mit oder ohne "inline"? Compiler macht ja eh, was er will ;) { return val_; }Und in Projekten die ich "sauber" halten will meistens so (wobei da wie gesagt so-gut-wie ausschliesslich Templates im Header landen).
Und sobald es viel Code wird wandert der ganze Inline Quargel dann auch in ein eigenes File, das dann am Ende der Header inkludiert wird.