GCC/Make Build-Zeit-Optimierungen
Wir haben Projekt verwendet gcc und make-Dateien. Projekt enthält auch eine große Teilprojekt (SDK) und eine Menge von relativ kleinen Teilprojekten, die Nutzung, die SDK und einigen gemeinsamen Rahmen.
Wir vorkompilierte Header verwenden, aber das hilft nur für die re-Kompilierung schneller zu sein.
Ist es bekannte Techniken und Werkzeuge, um mit build-Zeit-Optimierungen? Oder vielleicht kennen Sie einige Artikel/Ressourcen, die zu diesem oder verwandten Themen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie gegen das problem von zwei Seiten: überarbeiten Sie den code, um die Komplexität zu reduzieren, den der compiler sehen, der Beschleunigung oder der compiler Ausführung.
Ohne Sie zu berühren, den code, können Sie weitere Zusammenstellung macht in Sie. Verwenden Sie ccache zu vermeiden Neukompilierung Dateien, die Sie bereits zusammengestellt und distcc zu verteilen, die build-Zeit bei immer mehr Maschinen. Verwenden Sie make-j wobei N die Anzahl der Kerne+1, wenn Sie lokal kompiliert werden, oder eine größere Anzahl für verteilte builds. Die Flagge mit mehr als einem compiler parallel.
Refactoring der code. Lieber forward-Deklaration enthält (einfach). Entkoppeln, so viel wie Sie können, um Abhängigkeiten zu vermeiden (verwenden Sie das PIMPL-idiom).
Template-Instantiierung ist teuer, Sie werden kompiliert in jeder compilation unit, die Sie verwendet. Wenn Sie umgestalten von Vorlagen, um vorwärts zu deklarieren und Sie dann zu instanziieren Sie in nur einer compilation unit.
Die besten, die ich denken kann, mit
make
ist die-j
option. Dies sagtmake
zu laufen, so viele Arbeitsplätze wie möglich parallel:make -j
Wenn Sie möchten, um die Anzahl der gleichzeitigen Aufträge zu n, die Sie verwenden können:
make -j
nStellen Sie sicher, dass die Abhängigkeiten richtig sind, so
make
läuft nicht Arbeitsplätze, die er nicht zu haben.Andere Sache zu berücksichtigen ist, Optimierungen, die
gcc
mit der-O
wechseln. Sie können geben Sie verschiedene Ebenen der Optimierung. Je höher die Optimierung, je länger die compile-und link Zeiten. Ein Projekt, das ich arbeite mit läuft dauert 2 Minuten, um die Verknüpfung mit-O3
, und eine halbe minute mit-O1
. Sie sollten stellen Sie sicher, dass keine Optimierung mehr, als Sie müssen. Sie bauen könnte, ohne Optimierung für die Entwicklung baut und mit Optimierung für die Bereitstellung baut.Kompilieren mit debug-info (
gcc -g
) wird wahrscheinlich erhöhen Sie die Größe der ausführbaren Datei und kann Auswirkungen auf Ihre build-Zeit. Wenn Sie es nicht brauchen, versuchen Sie, es zu sehen, wenn es dich betrifft.Den Typ der Verlinkung (statische vs. dynamische) sollte einen Unterschied machen. Soweit ich das verstehe statische Verbindung dauert länger (obwohl ich hier falsch sein). Sie sollten sehen, ob sich dies auf Ihr zu bauen.
Aus der Beschreibung der Projekt-ich denke, dass Sie ein Makefile pro Verzeichnis und rekursiv eine Menge. In diesem Fall werden Techniken aus "Recursive Make Considered Harmful" sollte sehr viel helfen.
Wenn Sie mehrere Computer zur Verfügung gcc ist gut verteilt durch distcc.
Können Sie auch ccache zusätzlich.
Alle diese arbeiten mit sehr kleinen änderungen in den makefiles.
Auch, werden Sie wahrscheinlich wollen, um Ihre Quellcode-Dateien, wie klein und eigenständig wie möglich/machbar, also lieber viele kleinere Objekt-Dateien über eine riesige einzige Objekt-Datei.
Dies wird auch dazu beitragen, unnötige Neukompilierungen, zusätzlich können Sie eine statische Bibliothek mit Objekt-Dateien für die einzelnen source-code-Verzeichnis oder Modul grundsätzlich erlaubt der compiler Wiederverwendung, wie viel bereits kompilierten code wie möglich.
Etwas anderes, was noch nicht erwähnt, die in den vorhergehenden Antworten ist symbol Verknüpfung als "privat" wie möglich, also lieber statische Bindung (Funktionen, Variablen), die für Ihren code, wenn es nicht sichtbar nach außen.
Darüber hinaus können Sie auch wollen, mit der GNU-gold-linker, die viel effizienter für das kompilieren von C++ - code für die ELF Ziele.
Grundsätzlich würde ich Ihnen raten, sorgfältig zu Profil, Ihren build-Prozess und prüfen Sie, wo Sie die meiste Zeit verbringen, dass ' ll geben Ihnen einige Tipps, wie man der Optimierung Ihrer build-Prozess oder Ihre Projekte Quellcode-Struktur.
Könnten Sie überlegen, ob der Wechsel zu einem anderen build-system (die offensichtlich nicht für alle arbeiten), wie SCons. SCons ist viel klüger, als machen. Es scannt automatisch header-Abhängigkeiten, so haben Sie immer den kleinsten Satz rebuild der Abhängigkeiten. Durch das hinzufügen der Zeile
Decider('MD5-timestamp')
zu Ihrem SConstruct-Datei, SCons, wird der erste Blick auf die Zeitstempel einer Datei, und wenn es neuer als die zuvor erstellte Zeitstempel zu verwenden, wird die MD5 der Datei, um sicherzustellen, dass Sie tatsächlich etwas verändert. Dies funktioniert nicht nur auf dem Quell-Dateien, aber auch Objekt-Dateien sowie. Dies bedeutet, dass, wenn Sie ändern einen Kommentar, zum Beispiel, werden Sie nicht haben, um re-link.Die automatische überprüfung von header-Dateien hat auch dafür gesorgt, dass ich nie zu geben scons --clean. Es tut immer das richtige.
Wenn Sie ein LAN mit Entwickler-Maschinen, vielleicht sollten Sie versuchen, die Implementierung eines verteilten compiler-Lösung, wie distcc.
Dies könnte nicht helfen, wenn die ganze Zeit während der build ist für die Auswertung der Daten Abhängigkeiten, oder machen einige einen seriellen Aufgabe. Für die raw-crunch kompilieren vielen Quelldateien in Objektdateien, parallel-Gebäude offensichtlich hilft, wie vorgeschlagen (auf einer Maschine) von Nathan. Parallelisieren über mehrere Maschinen kann es sogar noch weiter.
http://ccache.samba.org/ Geschwindigkeiten bis große Zeit.
Arbeite ich an einem mittelgroßen Projekt, und das ist das einzige, was wir tun, um zu beschleunigen compile-Zeit.
Können Sie distcc verteilt compiler zu reduzieren den build mal, wenn Sie Zugriff auf mehrere Maschinen.
Hier ist ein Artikel von von IBM developerWorks Bezug auf distcc und wie Sie es verwenden können:
http://www.ibm.com/developerworks/linux/library/l-distcc.html
Anderen Methode zu reduzieren build-Zeit ist die Verwendung von vorkompilierten Headern. Hier ist ein Ausgangspunkt für gcc.
Vergessen Sie auch nicht verwenden -j beim Bau mit machen wenn Ihr Rechner mehr als eine cpu/core(2x die Anzahl der Kerne/cpus ist auch gut so).
Mit kleinen Dateien nicht immer eine gute Empfehlung. Eine Festplatte mit einem 32 oder 64 KB min Sektor-Größe, die eine Datei mit der Einnahme von mindestens einem Sektor. Also 1024 Dateien von 3K Größe (kleine code innen) tatsächlich nehmen 32 oder 64 Meg auf der Festplatte, statt der erwarteten 3 meg. 32/64 meg werden muss, dass Lesen von der Festplatte. Wenn die Dateien verstreut sind, um auf die Festplatte steigern Sie die Zeit noch mehr mit suchen Zeit. Dies half mit Disk-Cache offensichtlich an eine Grenze. vorkompilierte header kann auch gut helfen, zu lindern diese.
Also mit dem gebührenden Respekt zu coding-guidelines, es gibt keinen Punkt beim gehen aus Ihnen nur, jede strcuct, typedef oder utility-Klasse in separate Dateien.