Wie die Geschwindigkeit der Kompilierung von meinen CMake-fähigen C++ - Projekt?
Stieß ich auf mehrere Fragen in Bezug auf bestimmte Aspekte der Verbesserung der turn-around-Zeit von CMake-fähigen C++ - Projekte in letzter Zeit (wie "Auf welcher Ebene soll ich verteilen meinem build-Prozess?" oder "cmake rebuild_cache für nur - ein Unterverzeichnis?"), ich Frage mich, ob es eine mehr Allgemeine Hinweise die Nutzung der spezifischen Möglichkeiten CMake bietet. Wenn es wahrscheinlich keine cross-Plattform-Kompilierung, Optimierung, ich bin hauptsächlich daran interessiert, die Visual Studio oder GNU toochain basierte Ansätze.
Und ich bin mir schon bewusst, und investieren in der Regel empfohlen, die Bereiche um die Geschwindigkeit von C++ baut:
-
Änderung/Optimierung/Feineinstellung der toolchain
-
Optimieren Sie Ihre code-Basis/software-Architektur (e.g durch die Verringerung der Abhängigkeiten und nutzen, sowie definierte sub-Projekte - unit-tests)
-
Investieren Sie in eine bessere hardware (SSD, CPU, Speicher)
wie empfohlen hier, hier oder hier. Also mein Fokus in dieser Frage ist auf den ersten Punkt.
Plus ich weiß, dass die Empfehlungen finden sich in CMake Wiki:
Erstere nur die Grundlagen behandelt (parallel machen), die später Griffen meist wie speed-up-parsing CMake-Dateien.
Nur um diese ein wenig mehr Beton, wenn ich meine CMake Beispiel aus hier mit 100 Bibliotheken mit MSYS/GNU bekam ich folgende time
Messergebnisse:
$ cmake --version
cmake version 3.5.2
CMake suite maintained and supported by Kitware (kitware.com/cmake).
$ time -p cmake -G "MSYS Makefiles" ..
-- The CXX compiler identification is GNU 4.8.1
...
-- Configuring done
-- Generating done
-- Build files have been written to: [...]
real 27.03
user 0.01
sys 0.03
$ time -p make -j8
...
[100%] Built target CMakeTest
real 113.11
user 8.82
sys 33.08
So, ich habe insgesamt ~140 Sekunden und mein Ziel, bei diesem zugegebenermaßen sehr einfachen Beispiel wäre dies bis auf etwa 10-20% von dem, was ich mit den standard-Einstellungen/tools.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist, was ich hatte gute Ergebnisse mit der Verwendung von CMake und Visual Studio oder GNU toolchains:
Exchange GNU make mit Ninja. Es ist schneller, nutzt alle verfügbaren CPU-Kerne automatisch und hat eine gute dependency management. Nur bewusst sein,
ein.) Sie müssen, um den setup-target-Abhängigkeiten in CMake richtig. Wenn Sie zu einem Punkt, wo der build hat eine Abhängigkeit zu einem anderen Artefakt, es hat zu warten, bis diejenigen, die kompiliert werden (Synchronisations-Punkte).
b.) Verlinken ist immer so eine Synchronisation Punkt. So können Sie die Verwendung von CMake ist Objekt-Bibliotheken zu reduzieren diese, aber es macht Ihr CMake-code ein bisschen hässlicher.
Split weniger Häufig gewechselt werden-oder stable-code-Teile in separate CMake-Projekte und CMake ist
ExternalProject_Add()
oder - wenn Sie z.B. die Schalter für binäre Lieferung von einigen Bibliotheken -find_library()
.Denke an einen anderen Satz von compiler - /linker-Optionen für Ihre tägliche Arbeit (aber nur wenn Sie auch einige test-Zeit/Erfahrung mit dem final release build-Optionen).
ein.) Überspringen Sie die Optimierung Teile
b.) Versuchen Sie das inkrementelle linken
Wenn Sie oft änderungen an der CMake-code selbst, denken über den Wiederaufbau CMake aus Quellen, die optimal auf Ihre Maschine-Architektur. CMake ist offiziell von verteilten binaries sind nur ein Kompromiss, um die Arbeit auf jede mögliche CPU-Architektur.
Wenn ich mit MinGW64/MSYS Wiederaufbau CMake 3.5.2 mit z.B.
Kann ich beschleunigen Sie den ersten Teil:
Wenn Ihre Datei-I/O ist sehr langsam und da CMake funktioniert mit speziellen binary-output-Verzeichnisse, nutzen Sie eine RAM-disk. Wenn Sie noch eine Festplatte, die Umstellung auf eine solid state disk.
Abhängig von Ihrem endgültigen Ausgabe-Datei, wechseln Sie die GNU-standard-linker mit der Gold-Linker. Noch schneller als Gold-Linker ist die lld aus dem LLVM-Projekt. Sie haben, um zu überprüfen, ob es unterstützt bereits die benötigten features auf Ihrer Plattform.
Verwenden Clang/c2 anstelle von Visual C++ - compiler. Für die Visual C++ - compiler, performance-Empfehlungen werden von der Visual C++ - team, siehe https://blogs.msdn.microsoft.com/vcblog/2016/10/26/recommendations-to-speed-c-builds-in-visual-studio/
Increadibuild steigern kann die compilation-Zeit.
Referenzen
Für die Beschleunigung der CMake konfigurieren, mal sehen: https://github.com/cristianadam/cmake-checks-cache
LLVM + Clang bekam eine ~3x speedup.