Ich baue eine Menge von automatisch generierten Code, einschließlich einer besonders großen Datei (~15K Zeilen), mit einem mingw32 Cross-Compiler auf Linux. Die meisten Dateien sind extrem schnell, aber diese eine große Datei nimmt eine unerwartet lange Zeit (~15 Minuten) zu kompilieren.
Ich habe versucht, verschiedene Optimierungsflags zu manipulieren, um zu sehen, ob sie irgendeine Wirkung haben, ohne Erfolg. Was ich wirklich brauche, ist eine Möglichkeit, herauszufinden, was g++ tut, das so lange dauert. Gibt es (relativ einfache) Möglichkeiten, g++ dazu zu bringen, eine Ausgabe über die verschiedenen Phasen der Kompilierung zu erzeugen, um mir dabei zu helfen, die Ursache des Problems einzugrenzen?
Leider bin ich nicht in der Lage, diesen Cross-Compiler neu zu erstellen, so dass es nicht möglich ist, dem Compiler Debugging-Informationen hinzuzufügen und ihn durchzugehen.
Was in der Datei enthalten ist:
- ein Bündel von Includes
- eine Reihe von String-Vergleichen
- eine Reihe von Wenn-dann-Prüfungen und Konstruktoraufrufe
Die Datei ist eine Fabrik für die Erzeugung einer Vielzahl verschiedener spezifischer Unterklassen einer bestimmten übergeordneten Klasse. Die meisten der Includes sind jedoch nicht sonderlich ausgefallen.
Die Ergebnisse von -ftime-report, wie von Neil Butterworth vorgeschlagen, zeigen, dass die Phase "Lebensanalyse" 921 Sekunden dauert, was den größten Teil der 15 Minuten in Anspruch nimmt.
Es scheint, dass dies während der Datenflussanalyse geschieht. Die Datei selbst besteht aus einer Reihe von bedingten String-Vergleichen, bei denen ein Objekt nach dem als String angegebenen Klassennamen konstruiert wird.
Wir denken, dass die Änderung dieses Punktes in eine Abbildung von Namen auf Funktionszeiger die Dinge ein wenig verbessern könnte, also werden wir das versuchen.
Durch die Generierung einer Reihe von Fabrikfunktionen (pro Objekt) und die Erstellung einer Map vom String-Namen des Objekts zu einem Zeiger auf seine Fabrikfunktion konnte die Kompilierzeit von ursprünglich 15 Minuten auf etwa 25 Sekunden reduziert werden, was für jeden eine enorme Zeitersparnis bei der Erstellung von Builds bedeutet.
Nochmals vielen Dank an Neil Butterworth für den Hinweis auf -ftime-report.