Comment réduire le temps de compilation, et le temps de lien pour les projets Visual C++ (C++natif)?
Comment réduire le temps de compilation, et le temps de lien pour VC++ projets (natif C++)?
Veuillez préciser si chaque proposition s'applique à debug, release, ou les deux.
- Je souhaite que c'était deux question, l'un pour la liaison et l'autre pour la compilation (il l'a dit lors de l'attente pour un lien à compléter)
- Sans doute quelques réponses mais s'applique également à la fois
- vous pouvez lire mon post dans ce thread. here
Vous devez vous connecter pour publier un commentaire.
Il peut sembler évident pour vous, mais nous essayons d'utiliser les déclarations de l'avant autant que possible, même si cela nécessite d'écrire de longs espaces de noms du type(s) est/sont:
Il réduit considérablement le temps de la compilation aussi sur d'autres compilateurs. En effet, il s'applique à toutes les configurations 🙂
Utilisation la Poignée/du schéma Corporel (également connu comme "pimpl", "carte", "décorateur", "pont" ou un "wrapper"). En isolant la mise en œuvre de vos classes dans votre .fichiers cpp, ils ont seulement besoin d'être compilé une fois. La plupart des changements ne nécessite pas de modifier le fichier d'en-tête donc, cela signifie que vous pouvez faire d'assez nombreux changements, tout en ne nécessitant qu'un seul fichier pour être recompilé. Cela encourage également refactoring et la rédaction de commentaires et les tests unitaires depuis le temps de compilation est diminué. En outre, vous de séparer automatiquement les préoccupations de l'interface et la mise en œuvre de l'interface de votre code est simplifié.
Si vous avez de gros complexes en-têtes qui doit être compris par la plupart de la .fichiers cpp dans votre processus de création, et qui ne sont pas changés très souvent, vous pouvez précompiler eux. Dans un projet Visual C++ avec une configuration typique, c'est simplement une question de les inclure dans stdafx.h. Cette fonctionnalité a ses détracteurs, mais les bibliothèques qui font de la pleine utilisation de modèles ont tendance à avoir beaucoup de choses dans les en-têtes, et les en-têtes précompilés sont le moyen le plus simple pour accélérer les constructions dans ce cas.
Ces solutions s'appliquent à la fois debug et release, et sont axés sur une base de code qui est déjà grand et encombrant.
En avant les déclarations sont une solution commune.
Distribué bâtiment, comme avec Incredibuild est une victoire.
Poussant de code à partir des en-têtes vers le bas dans les fichiers source peuvent travailler. Les petites classes, les constantes, les énumérations et ainsi de suite pourrait commencer dans un fichier d'en-tête simplement parce qu'il pourrait avoir été utilisé dans plusieurs unités de compilation, mais en réalité ils ne sont utilisés que dans un seul, et peut être déplacée dans le fichier cpp.
Une solution, je ne l'ai pas lu, mais ont utilisé est de fractionner les grands en-têtes. Si vous avez une poignée de très grands en-têtes, jetez un oeil à eux. Ils peuvent contenir des informations connexes, et peut aussi dépendre de beaucoup d'autres en-têtes. Prendre les éléments qui n'ont pas de dépendances sur d'autres fichiers...simple, les structures, les constantes, les énumérations et les déclarations de l'avant et de les déplacer à partir de
the_world.h
àthe_world_defs.h
. Maintenant, vous pouvez trouver que beaucoup de vos fichiers source peuvent maintenant inclure uniquementthe_world_defs.h
et d'éviter d'inclure tous les coûts indirects.Visual Studio dispose également d'un "Spectacle Comprend" qui peut vous donner une idée de la source des fichiers comprennent de nombreux en-têtes et qui fichiers d'en-tête sont le plus souvent inclus.
Très commun comprend, pensez à les mettre dans un en-tête précompilé.
- Je utiliser L'Unité S'Appuie (Screencast trouve ici).
La compilation de vitesse question est assez intéressant de constater que Stroustrup a dans son FAQ.
Nous utilisons Xoreax de Incredibuild pour exécuter compilation en parallèle sur plusieurs machines.
Également un article intéressant de Ned Batchelder: http://nedbatchelder.com/blog/200401/speeding_c_links.html (C++ sur Windows).
Le développement de nos machines sont toutes quad-core, et nous utiliser Visual Studio 2008 prend en charge parallèle de la compilation. Je suis pas sûr que toutes les éditions de VS pouvez le faire.
Nous avons un fichier de solution avec environ 168 projets individuels, et la compilation de cette manière prend environ 25 minutes sur notre quad-core machines, comparativement à environ 90 minutes sur la seule base des ordinateurs portables que nous donnons aux étudiants de l'été. Pas exactement comparables machines, mais vous voyez l'idée 🙂
Avec Visual C++, il existe une méthode, certains appellent à l'Unité, qui améliore la liaison significative du temps en réduisant le nombre de modules de l'objet.
Cela implique la concaténation du code C++, habituellement en groupes par la bibliothèque. Ce cours fait modifiant le code beaucoup plus difficile, et vous serez confronté à des collisions d'espace de noms, à moins que vous les utilisez. Qu'il vous garde à l'aide de "using namespace foo";
Plusieurs équipes au sein de notre société ont des systèmes élaborés de prendre la normale C++ fichiers et de les enchaîner au moment de la compilation comme une étape de génération. La réduction du temps de liaison peuvent être énormes.
Une autre technique utile est blobbing. Je pense que c'est quelque chose de semblable à ce qui a été décrit par Matt Shaw.
Tout simplement, il vous suffit de créer un fichier cpp dans lequel vous inclure d'autres fichiers cpp. Vous pouvez avoir deux différentes configurations de projet, l'une ordinaire et une goutte. Bien sûr, blobbing met un peu limite sur votre code, par exemple, les noms de classe sans nom dans les espaces de noms peuvent être en contradiction.
Une technique pour éviter de recompiler le code entier dans un blob (comme David Rodríguez mentionné) lorsque vous modifiez un fichier cpp - est d'avoir votre "travail" blob qui est créé à partir des fichiers modifiés récemment et autres ordinaires des gouttes.
Nous utilisons blobbing au travail la plupart du temps, et il réduit le projet de construction, en particulier de la liaison.
Moment De La Compilation:
Si vous avez IncrediBuild, la compilation ne sera pas un problème. Si vous n'avez pas de IncrediBuild, essayez de "l'unité de la construction" de la méthode. Il combiner plusieurs fichiers cpp pour un seul fichier cpp donc tout le temps de compilation est réduite.
La Liaison:
"L'unité de la construction" méthode également contribuer à réduire le temps de lien, mais pas beaucoup. Comment jamais, vous pouvez vérifier si "l'Ensemble de l'optimisation globale" et "LTCG" sont activées, alors que ces indicateurs de rendre le programme rapide, ils font le lien LENTE.
Essayez de désactiver "l'Ensemble de l'Optimisation Globale" et de l'ensemble de la LTCG à "par Défaut" le temps de lien pourrait être réduit de 5/6.
(LTCG représente le Lien le Temps de Génération de Code)