Comment améliorer Visual C++ temps de compilation?
Je compile les 2 projets C++ dans un buildbot, sur chaque commit. Les deux sont autour de 1000 fichiers, l'un est de 100 kloc, l'autre de 170 kloc. Les temps de Compilation sont très différents de gcc (4.4) dans Visual C++ (2008).
Visual C++ compilations pour un projet de prendre dans les 20 minutes. Ils ne peuvent pas tirer parti des processeurs multi-cœurs, car un projet dépend de l'autre. En fin de compte, une compilation complète des deux projets en Debug et Release, en 32 et 64 bits prend plus de 2 heures 1/2.
gcc compilations pour un projet de prendre dans les 4 minutes. Il peut être parallélisé sur les 4 cœurs et dure environ 1 min 10 sec. Tous les 8 versions pour 4 versions (Debug/Release, 32/64 bits) des 2 projets sont compilés en moins de 10 minutes.
Ce qui se passe avec Visual C++ temps de compilation? Ils sont pratiquement 5 fois plus lente.
Quel est le temps moyen qui peut être prévu pour compiler en C++ kloc? Les miennes sont de 7 s/kloc avec vc++ et 1.4 s/kloc avec gcc.
Quelque chose peut être fait pour accélérer les temps de compilation sur Visual C++?
- Le disque est seulement 1/3. Je doute que la fragmentation et la DLL copies peuvent couper les temps de compilation par 5! À peine 10 % peut-être, mais pas plus.
- Merci pour les points... Mais juste curieux... c'était les instanciations dans les fichiers d'en-tête qui était le problème, ou l'une des autres choses que j'ai citées?
- Quelque chose qui nous a fait une énorme quantité était de déplacer toutes les temporaires, intermédiaire et de pch des fichiers sur un disque ram, mais encore jamais aussi vite que GCC en dépit de la boîte de Windows disques ssd et la boîte linux ayant hds. Nous avons été la compilation sur un Dual Xeon E5440, et j'ai trouvé "font -j33" a donné radicalement mieux les temps de compilation que l' "-j9" que les gens recommandé (j'ai couru un simple script de référence de tous les j de réglage de 0 à 99 ans)
Vous devez vous connecter pour publier un commentaire.
Une chose qui ralentit le VC++ compilateur est si vous avez un fichier d'en-tête qui initialise des cas concrets de non-trival
const
types de valeur. Vous pouvez voir cela se produire avec des constantes de typestd::string
ou Guid. Il affecte à la fois la compilation et de la liaison.Pour une seule dll, ce qui a provoqué une 10x ralentissement. Il aide si vous les mettez dans un fichier d'en-tête de fichier, ou, il suffit de déclarer dans un en-tête et les initialiser dans un fichier cpp.
Faire prendre un coup d'oeil dans le scanner de virus, et être sûr d'expérimenter avec les en-têtes précompilés, sans elle, vous ne verrez pas de VC++ à son meilleur.
Oh ouais, et assurez-vous que le dossier TMP %est sur la même partition que celle où votre build est écrit, que VC++ rend les fichiers temporaires et les déplace plus tard.
const
s. Je vais le modifier dans. Je n'ai pas d'écrire le code. Je l'ai fixée par l'avant de déclarer les noms et les initialiser dans un fichier cpp.Les projets en fonction les uns des autres ne signifie pas qu'aucun de parallélisation est possible. Les systèmes de construction sont assez intelligent pour comprendre et éviter les critiques depenedancies, Sinon gcc ne serait pas en mesure d'utiliser les 4 cœurs.
Donc (en plus des autres mesures), pourquoi ne pas simplement essayer de l'activation de multitraitement dans Visual Studio à l'aide de /MP (Voir http://msdn.microsoft.com/en-us/library/bb385193.aspx).
Ce n'est pas la réponse directe à la question, mais à mon entreprise, nous utilisons IncrediBuild pour une compilation distribuée. Il accélère vraiment le processus de compilation. http://incredibuild.com/visual_studio.htm
Comment construisez-vous les projets Visual Studio? Êtes-vous simplement à l'exécution de l'ide (devenv) avec le projet et
/build
ou avez-vous un fichier makefile similaire à ce que je suppose que vous utilisez pour la gcc. Je suis en supposant que les deux versions utiliser un makefile, mais j'ai pensé qu'il vaut la peine de vérifier.Êtes-vous en utilisant les en-têtes précompilés pour compiler? Si vous n'êtes PAS en utilisant les en-têtes précompilés pour VS, alors vous pouvez passer à un autre de leur utilisation. Personnellement, je vous recommande d'utiliser le
#pragma hdrstop
approche plutôt qu'un seul all inclusive fichier d'en-tête, mais si vous n'êtes PAS en utilisant les en-têtes précompilés et que vous souhaitez essayer un seul all inclusive fichier d'en-tête de la force inclus (à l'aide de la/FI
compilateur commutateur de ligne de commande) peut être testé rapidement sans aucune modification de code.J'ai écrit sur les deux
/FI
et#pragma hdrstop
ici: http://www.lenholgate.com/blog/2004/07/fi-stlport-precompiled-headers-warning-level-4-and-pragma-hdrstop.html/FI
drapeau. Pas un grand fan de#pragma hdrstop
si#pragma hdrstop
? C'est une manière très pratique de permettre à nettoyer minimale de dépendance crée pas de fichier rapide, construit avec les en-têtes précompilés qui est, à mon humble avis, un excellent moyen pour s'assurer que le code ne comprend ce dont il a besoin, ce qui en facilite la réutilisation...Le livre "à Grande Échelle en C++ de Logiciels de Conception" par Jean Lakos a de nombreux conseils sur la façon de structurer votre code et de conception pour des projets de grande envergure. Y compris de nombreux conseils sur l'accélération de la compilation. Ne sont pas directement liées à Visual C++, mais bien la peine de lire de toute façon.
J'ai écrit deux articles sur les techniques qui permettent de réduire le temps de compilation. Parmi ces techniques, un post sur d'en-tête précompilé et l'unité s'appuie qui peuvent vous aider à améliorer les temps de compilation. Ils sont expédiés avec CMake scripts qui gèrent les techniques de manière transparente.
Tout d'abord, dans la plupart des cas, vous pouvez construire debug et release configurations d'un même projet en parallèle.
Aussi ce que vous décrivez sonne horriblement lent - on dirait que vous n'utilisez pas les en-têtes précompilés dans VC++ ou en les utilisant à tort - qu'ils sont spécifiquement destinés à améliorer le temps de compilation.
Peut-être il ya un problème avec la vérification de la dépendance, sauf si vous forcez une reconstruction complète.
Vous pourriez faire quelques bibliothèques statiques. Mettre le code que rarement les changements dans les bibliothèques.
Le plus lent des parties de la construction d'un programme:
les fichiers.
En général, la liaison et l'exécutable création phases sont les plus rapides.
Avez-vous déterminé:
Rappelez-vous, lors de la détermination de l'efficacité, toujours de profil (d'une manière ou d'une autre).
Vous êtes sur la même machine? Êtes-vous en utilisant le même système d'exploitation? J'ai vu des différences de vitesse dans la région de 3 à 10 fois lors de la comparaison de GCC dans Cygwin et de la GCC dans une VirtualBox machine en cours d'exécution à l'intérieur de l'hébergement Windows Cygwin.
Il semble très étrange qu'il y aurait une telle différence... mais il n'y a aucune raison que vous ne pouvez pas profiter de la multicores sur le Visuel soit!
Fondamentalement, vous avez 4 compilations modes: (Debug/Release)x(32bits/64bits), chacune étant totalement indépendants l'un de l'autre, vous pouvez l'exécuter parfaitement les 4 en parallèle, en tirant pleinement parti des 4 cœurs disponibles. Ou tout simplement essayer de le Multiprocesseur approche sur Visual Studio.
Cependant cela ne va pas le couper. 150 minutes par rapport à 10 minutes est un énorme fossé. De mon expérience personnelle, il y a 2 facteurs importants dans la réduction des temps de compilation:
Compiler et lier un fichier cpp à un moment, même lorsque l'en-tête de fichier changements affectent plusieurs fichiers cpp. Cela peut être accomplised avec visual studio macro:
Ne sais pas si c'est toujours un problème et comment beaucoup d'amélioration que vous avez obtenu dans le menatime, mais si il se trouve encore que msbuild ne sais pas comment orchestrer simultanément au sein d'un projet (chaque rpc doivent être séparément constructible, sauf si vous avez quelques codegens - codegens sont déplacées le mieux à un projet distinct) vous hay avoir à télécharger le kit de développement de pilotes ou .NET SSCLI car ils ont tous les deux nmake, de construire qui sont connus pour paralelize bien les choses. SSCLI déjà eu le construire de construire de l'installation, ne pas oublier si DDK a certaines construire des échantillons de le faire, vous devez commencer à partir de zéro.
Aussi un peu un peu vieux article sur MSBuild de parallélisation de ne pas aller dans les détails, mais mentiones quelques diff entre le montant réel des msbuild et msbuild + de la sln. Si l' /MP vs /Gm était le seul problème, alors vous pourriez avoir à faire un petit script ou C# exe à modifier .proj fichiers pour le laboratoire de construire. Ou de l'utilisation explicite de la ligne de cmd remplacer dans les projets et prendre cette option à partir d'un env var.