Wie bestimmen moderne Optimierungscompiler, wann bestimmte Optimierungen wie Loop-Abrollung und Code-Inlining angewendet werden sollen?Wie bestimmen moderne optimierte Compiler, wann sie optimiert werden sollen?
Da sich beide auf das Caching auswirken, führt das naive Inlining von Funktionen mit weniger als X Zeilen oder einer anderen einfachen Heuristik wahrscheinlich zu schlechterem Code. Wie gehen moderne Compiler damit um?
Ich habe eine harte Zeit, Informationen darüber zu finden (vor allem Informationen, die einigermaßen einfach zu verstehen ..), über das Beste, was ich finden konnte, ist die wikipedia article. Alle Details, Links zu Büchern/Artikeln/Papieren werden sehr geschätzt!
EDIT: Da die Antworten hauptsächlich über die beiden erwähnten Optimierungen (Inlining und Loop-Enrolling) sprechen, wollte ich nur klarstellen, dass ich an allen Compiler-Optimierungen interessiert bin, nicht nur an diesen beiden. Ich interessiere mich auch mehr für die Optimierungen, die während der Kompilierung vor der Zeit durchgeführt werden können, obwohl die JIT-Optimierung von Interesse ist (wenn auch in etwas geringerem Maße).
Danke!
JIT hat nicht immer die Zeit für einige massive Optimierungen, und Codepaths variieren manchmal massiv von den Daten, so dass profilgesteuerte Optimierungen nicht immer der richtige Pfad sind. –