Comment faire pour accélérer les Temps de Compilation de mon CMake activé Projet C++?
Je suis tombé sur plusieurs questions concernant des aspects spécifiques de l'amélioration du délai de CMake permis C++ projets ces derniers temps (comme "À quel niveau dois-je répartir mes processus de génération?" ou "cmake rebuild_cache pour que un sous-répertoire?"), je me demandais si il n'y a plus une orientation générale en utilisant les possibilités spécifiques de CMake offre. Si il n'y a probablement pas de croix-plate-forme de compilation à l'optimisation du temps, je m'intéresse principalement dans Visual Studio ou GNU toochain approches fondées.
Et je suis déjà au courant et d'investissement dans le généralement recommandé dans les zones à vitesse C++: les versions de
-
Modifier/Optimiser/affiner le réglage de la chaîne d'
-
Optimiser votre base de code/l'architecture logicielle (e.g en réduisant les dépendances et l'utilisation bien défini de sous-projets - tests unitaires)
-
Investir dans un meilleur matériel (SSD, PROCESSEUR, mémoire)
comme recommandé ici, ici ou ici. Mon point de focalisation dans cette question est sur le premier point.
Plus je connais les recommandations pour être trouvé dans CMake Wiki:
L'ancien juste gère les bases (parallèle à faire), le plus tard poignées surtout comment la vitesse d'analyse de fichiers CMake.
Juste pour rendre tout ceci un peu plus concret, si je prends mon CMake exemple de ici avec 100 bibliothèques à l'aide de MSYS/GNU j'ai eu la suivante time
les résultats de la mesure:
$ 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
J'ai donc un total de ~140 secondes et mon objectif pour cette certes très simple exemple - serait d'obtenir cette baisse à environ 10 à 20% de ce que j'obtiens avec les paramètres standard/outils.
Vous devez vous connecter pour publier un commentaire.
Voici ce que j'ai eu de bons résultats avec l'utilisation de CMake et Visual Studio ou GNU toolchains:
Échange de GNU make avec Ninja. C'est plus rapide, permet l'utilisation de tous les cœurs processeurs disponibles automatiquement et dispose d'une bonne gestion de la dépendance. Juste être conscient de
un.) Vous devez configurer la cible des dépendances dans CMake correctement. Si vous arrivez à un point où la construction a une dépendance à un autre artefact, il doit attendre jusqu'à ce que ceux-ci sont compilés (points de synchronisation).
b.) La liaison est toujours un point de synchronisation. Donc, vous pouvez faire plus d'utilisation de CMake est Les Bibliothèques D'Objets pour réduire ceux-ci, mais il rend votre CMake code un peu plus laide.
Split moins fréquemment changé ou code stable des pièces séparées, CMake projets et l'utilisation de CMake est
ExternalProject_Add()
ou si vous avez par ex. commutateur binaire de livraison de certaines bibliothèques -find_library()
.Penser à un ensemble différent de compilateur/linker options pour votre travail au quotidien (mais seulement si vous avez aussi des temps de test/de l'expérience avec la version finale les options de compilation).
un.) Passez l'optimisation des pièces de
b.) Essayez de liaison incrémentielle
Si vous êtes souvent faire des changements à la CMake code lui-même, à penser à reconstruire CMake à partir de sources optimisé pour votre machine de l'architecture. CMake est officiellement distribué binaires sont juste un compromis pour travailler sur tous les possibles de l'architecture du PROCESSEUR.
Lorsque j'utilise MinGW64/MSYS pour reconstruire CMake 3.5.2 avec, par exemple,
Je peux accélérer la première partie:
Si votre fichier I/O est très lent et depuis CMake œuvres dédiées sortie binaire répertoires, faire usage d'un disque RAM. Si vous utilisez un disque dur, envisager de passer à un état solide disque.
En fonction de votre fichier de sortie final, l'échange standard de GNU éditeur de liens avec le L'Or De L'Éditeur De Liens. Encore plus vite que l'Or de l'éditeur de liens est lld à partir de la VERSION du projet. Vous avez pour vérifier si il supporte déjà les fonctionnalités nécessaires sur votre plate-forme.
Utilisation Clang/c2 au lieu de compilateur Visual C++. Pour le compilateur Visual C++ de la performance des recommandations sont fournies à partir de l'équipe Visual C++, voir https://blogs.msdn.microsoft.com/vcblog/2016/10/26/recommendations-to-speed-c-builds-in-visual-studio/
Increadibuild pouvez augmenter le temps de compilation.
Références
Pour accélérer le CMake configurer le temps de voir: https://github.com/cristianadam/cmake-checks-cache
LLVM + Clang a un ~3x plus rapide.