web-dev-qa-db-fra.com

Comment pouvez-VOUS réduire le temps de compilation et le temps de liaison pour les projets Visual C++ (C++ natif)?

Comment réduisez-vous le temps de compilation et le temps de liaison pour les projets VC++ (C++ natif)?

Veuillez spécifier si chaque suggestion s'applique au débogage, à la publication ou aux deux.

39
Brian R. Bondy

Cela peut sembler évident pour vous, mais nous essayons d'utiliser autant que possible les déclarations forward, même si cela nécessite d'écrire des noms d'espaces de noms longs dans lesquels le/les type (s) est/sont dans:

// Forward declaration stuff
namespace plotter { namespace logic { class Plotter; } }

// Real stuff
namespace plotter {
    namespace samples {
        class Window {
            logic::Plotter * mPlotter;
            // ...
        };
    }
}

Cela réduit considérablement le temps nécessaire pour compiler également sur d'autres compilateurs. En effet cela s'applique à toutes les configurations :)

44

Utilisez le motif Poignée/Corps (également parfois appelé "pimpl", "adaptateur", "décorateur", "pont" ou "wrapper"). En isolant l'implémentation de vos classes dans vos fichiers .cpp, elles ne doivent être compilées qu'une seule fois. La plupart des modifications ne nécessitent pas de modifications du fichier d'en-tête, ce qui signifie que vous pouvez effectuer des modifications assez importantes tout en ne nécessitant qu'un seul fichier à recompiler. Cela encourage également la refactorisation et la rédaction de commentaires et de tests unitaires, car le temps de compilation est réduit. De plus, vous séparez automatiquement les problèmes d’interface et de mise en œuvre afin de simplifier l’interface de votre code.

21
1800 INFORMATION

Si vous avez de grands en-têtes complexes qui doivent être inclus par la plupart des fichiers .cpp dans votre processus de construction et qui ne sont pas modifiés très souvent, vous pouvez les précompiler. Dans un projet Visual C++ avec une configuration typique, il suffit simplement de les inclure dans stdafx.h. Cette fonctionnalité a ses détracteurs, mais les bibliothèques qui utilisent pleinement les modèles ont tendance à avoir beaucoup d'éléments dans les en-têtes, et les en-têtes précompilés sont le moyen le plus simple d'accélérer les générations dans ce cas.

14
Daniel Earwicker

J'utilise Unity Builds (Screencast situé ici ).

8
OJ.

Ces solutions s’appliquent à la fois au débogage et à la publication, et sont centrées sur une base de code déjà volumineuse et encombrante.

Les déclarations anticipées sont une solution commune.

La construction distribuée, comme avec Incredibuild, est une victoire.

Pousser le code des en-têtes dans les fichiers sources peut fonctionner. Les petites classes, constantes, énumérations, etc. peuvent commencer dans un fichier d’en-tête simplement parce que aurait pu avoir été utilisé dans plusieurs unités de compilation, mais en réalité, elles ne sont utilisées que dans une seule unité et pourraient être déplacées vers le même répertoire. fichier cpp.

Une solution que je n'ai pas lue mais que j'ai utilisée est de scinder les gros en-têtes. Si vous avez une poignée de très gros en-têtes, jetez-y un coup d'œil. Ils peuvent contenir des informations connexes et peuvent également dépendre de nombreux autres en-têtes. Prenez les éléments qui ne dépendent pas d'autres fichiers ... simples structures, constantes, enums et déclarations forward et déplacez-les de the_world.h à the_world_defs.h. Vous constaterez peut-être maintenant que bon nombre de vos fichiers source ne peuvent désormais inclure que the_world_defs.h et éviter d'inclure tout ce surdébit.

Visual Studio propose également une option "Afficher les inclus" qui peut vous donner une idée des fichiers source contenant de nombreux en-têtes et des fichiers d'en-tête les plus fréquemment inclus. 

Pour les inclusions très courantes, envisagez de les placer dans un en-tête pré-compilé.

8
Drew Dormann

Nous utilisons Incredibuild de Xoreax pour exécuter la compilation en parallèle sur plusieurs machines.

7
crashmstr

La question de la vitesse de compilation est suffisamment intéressante pour que Stroustrup l’ait dans son FAQ .

7
David Norman

Également un article intéressant de Ned Batchelder: http://nedbatchelder.com/blog/200401/speeding_c_links.html (à propos de C++ sous Windows).

5
Paweł Hajdan

Nos machines de développement sont toutes quadricœurs et nous utilisons Visual Studio 2008 pour la compilation en parallèle. Je ne sais pas si toutes les éditions de VS peuvent le faire.

Nous avons un fichier de solution avec environ 168 projets individuels. Compiler cela prend environ 25 minutes sur nos machines quadricœurs, contre environ 90 minutes sur les ordinateurs portables à cœur unique que nous donnons aux étudiants d’été. Pas exactement des machines comparables mais vous avez une idée :)

4
Chris Cameron

Avec Visual C++, il existe une méthode, que certains appellent Unity, qui améliore considérablement le temps de liaison en réduisant le nombre de modules d'objet.

Cela implique la concaténation du code C++, généralement dans des groupes par bibliothèque. Cela rend bien sûr la modification du code beaucoup plus difficile, et vous risquez des collisions d’espaces de noms si vous ne les utilisez pas bien. Cela vous empêche d'utiliser "using namespace foo";

Plusieurs équipes de notre société ont des systèmes élaborés pour prendre les fichiers C++ normaux et les concaténer au moment de la compilation en tant qu’étape de construction. La réduction des temps de liaison peut être énorme.

2
Matt Shaw

Une autre technique utile est blobbing. Je pense que cela ressemble à ce que Matt Shaw a décrit.

En termes simples, vous créez simplement un fichier cpp dans lequel vous incluez d’autres fichiers cpp. Vous pouvez avoir deux configurations de projet différentes, une ordinaire et une blob. Bien sûr, le blob met certaines contraintes sur votre code, par exemple. Les noms de classe dans des espaces de noms non nommés peuvent entrer en conflit.

Une technique pour éviter de recompiler tout le code dans un blob (comme l'a mentionné David Rodríguez) lorsque vous modifiez un fichier cpp - consiste à avoir votre blob "de travail" créé à partir de fichiers modifiés récemment et d'autres blobs ordinaires.

Nous utilisons la plupart du temps des blobs au travail, ce qui réduit le temps de construction du projet, en particulier le temps de liaison.

1
alariq

Temps de compilation:
Si vous avez IncrediBuild, le temps de compilation ne sera pas un problème. Si vous n'avez pas de IncrediBuild, essayez la méthode de "consolidation à l'unité". Il combine plusieurs fichiers cpp en un seul fichier cpp afin de réduire le temps de compilation. 
Temps de liaison:
La méthode de "consolidation de l'unité" contribue également à réduire le temps de liaison, mais pas beaucoup. Cependant, vous pouvez vérifier si les options "Optimisation globale globale" et "LTCG" sont activées. Bien que ces indicateurs rendent le programme rapide, ils rendent le lien LENT. 
Essayez de désactiver "Whole Global Optimization" et réglez LTCG sur "Default", le temps de liaison pourrait être réduit de 5/6. 
(LTCG signifie Link Time Code Generation)

0
Jeff Jiang