Comment améliorer les temps de compilation Visual C++?

je suis en train de compiler 2 projets C++ dans un buildbot, sur chaque commit. Les deux sont environ 1000 dossiers, un est 100 kloc, l'autre 170 kloc. Les temps de Compilation sont très différents de gcc (4.4) à Visual C++ (2008).

les compilations visuelles C++ pour un projet prennent 20 minutes. Ils ne peuvent pas profiter des multiples noyaux parce qu'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 1/2 heure.

compilations gcc pour un projet prennent dans les 4 minutes. Il peut être parallélisé sur les 4 noyaux et prend environ 1 min 10 Secondes. Les 8 compilations pour 4 versions (Debug/Release, 32/64 bits) des 2 projets sont compilées 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 auquel on peut s'attendre à compiler un c++ kloc? Les mines sont 7 s / kloc avec vc++ et 1,4 s / kloc avec gcc.

peut-on faire quelque chose pour accélérer les temps de compilation sur Visual C++?

46
demandé sur Didier Trosset 2010-02-12 13:51:18

12 réponses

une chose qui ralentit le compilateur VC++ est si vous avez un fichier d'en-tête qui initialise des instances concrètes de non-trival const types de valeurs. Vous pouvez voir cela se produire avec des constantes de type std::string ou GUIDs. Elle affecte à la fois le temps de compilation et le temps de liaison.

pour une dll simple, cela a causé un ralentissement 10x. 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.

jetez un coup d'oeil sur le virus scanner, et assurez-vous d'expérimenter avec des headers précompilés, sans cela vous ne verrez pas VC++ à son meilleur.

Oh oui, et assurez-vous que le dossier %TMP% est sur la même partition que celle où votre compilation est écrite, car VC++ crée des fichiers temp et les déplace plus tard.

15
répondu 2012-05-21 17:40:16

les projets qui dépendent les uns des autres ne signifient pas qu'aucune parallélisation n'est possible. Les systèmes de construction sont assez intelligents pour comprendre et éviter les dépendances critiques, sinon gcc ne serait pas en mesure d'utiliser 4 cœurs.

donc (en plus des autres étapes), pourquoi ne pas essayer d'activer le multiprocesseur dans Visual Studio en utilisant / MP (voir http://msdn.microsoft.com/en-us/library/bb385193.aspx).

11
répondu jdisk 2010-02-12 11:38:29

ce n'est pas la réponse directe à la question mais dans mon entreprise nous utilisons IncrediBuild pour la compilation distribuée. Il accélère vraiment le processus de compilation. http://incredibuild.com/visual_studio.htm

6
répondu tommyk 2010-02-12 18:11:37

comment construisez-vous les projets de studio visuel? Est-ce que vous lancez juste l'ide (devenv) avec le projet et /build ou avez-vous un makefile similaire à ce que je suppose que vous utilisez pour gcc. Je suppose que les deux constructions utilisent un makefile similaire mais j'ai pensé qu'il valait la peine de vérifier.

utilisez-vous des en-têtes précompilés pour l'un ou l'autre des compilateurs? Si vous n'utilisez pas de headers précompilés pour VS, vous pouvez passer à leur utilisation. Personnellement, je recommande d'utiliser le #pragma hdrstop approche plutôt qu'un seul fichier d'en-tête tout compris, mais si vous n'utilisez pas actuellement les en-têtes précompilés et que vous voulez l'essayer un seul fichier d'en-tête tout compris qui est force inclus (en utilisant le /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

6
répondu Len Holgate 2010-12-24 05:41:31

le livre "Large-Scale C++ Software Design" de John Lakos contient de nombreux conseils sur la structuration de votre code et du design pour des projets à grande échelle. Y compris de nombreux conseils pour accélérer la compilation. Pas directement lié à Visual C++, mais cela vaut la peine d'être lu de toute façon.

3
répondu Hollance 2010-08-05 11:50:46

j'ai écrit deux articles sur des techniques qui réduisent le temps de compilation. Parmi ces techniques un post sur en-tête précompilé et l'unité s'appuie cela peut vous aider à améliorer les temps de compilation. Ils expédient avec des scripts CMake qui gèrent les techniques de manière transparente.

2
répondu cheind 2010-02-21 19:02:52

tout d'abord, dans la plupart des cas, vous pouvez construire des configurations de débogage et de publication du même projet en parallèle.

aussi ce que vous décrivez semble horriblement lent - on dirait que vous n'utilisez pas des en - têtes précompilés en VC++ ou que vous ne les utilisez pas correctement-ils sont spécifiquement destinés à améliorer le temps de compilation.

1
répondu sharptooth 2010-02-12 11:22:15

peut-être qu'il y a un problème avec la vérification de la dépendance, à moins que vous ne forciez une reconstruction complète.

Vous pourriez faire quelques bibliothèques statiques. Mettez du code qui change rarement dans les bibliothèques.

Le plus lent des parties de la construction d'un programme:

  1. ouvrir et fermer les dossiers.
  2. analyse et traduction source fichier.

en général, les phases de création de liens et d'exécutables sont les plus rapides.

Avez-vous déterminé:

  1. quelles sont les phases les plus lentes?
  2. quels fichiers sont les plus lents à compiler?

rappelez-vous, lors de la détermination de l'efficacité, toujours le profil (d'une manière ou d'une autre).

1
répondu Thomas Matthews 2010-02-12 17:47:45

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-10x en comparant GCC dans Cygwin et GCC dans une machine VirtualBox tournant à l'intérieur de L'hébergement de Cygwin Windows.

0
répondu e8johan 2010-02-12 11:37:58

Il semble très étrange qu'il y aurait une telle différence... mais il n'y a aucune raison que vous ne puissiez pas profiter des multicores sur Visual non plus!

fondamentalement vous avez 4 modes de compilation: (Debug / Release) x(32bits/64bits), chacun étant totalement indépendant de l'autre, vous pouvez parfaitement exécuter les 4 en parallèle, en profitant pleinement des 4 cœurs disponibles. Ou tout simplement essayer l'approche multiprocesseur sur Visual Studio aussi.

cependant ce n'est pas aller à le couper. 150 minutes contre 10 minutes est un énorme écart. D'après mon expérience personnelle, il y a deux facteurs importants pour réduire le temps de compilation:

  • avoir tous les fichiers utilisés sur un disque local (en utilisant la réplication des fichiers distants si nécessaire) et tous les fichiers créés localement aussi (.o .donc)
  • utilisez tous les cœurs à votre disposition,et si vous le pouvez, même aller Machines Multi (distcc etc...)
0
répondu Matthieu M. 2010-02-12 11:44:35

Compiler et lier un fichier cpp à un moment, même lorsque les changements d'en-tête de fichier affectent plusieurs fichiers cpp. Cela peut être réalisé avec visual studio macro:

Dim WithEvents myTimer As Timers.Timer

Sub CompileAndLinkCurrentCppFile()
    DTE.ExecuteCommand("Build.Compile")
    myTimer = New Timers.Timer
    myTimer.Interval = 0.05
    myTimer.Start()
End Sub

Sub myTimer_Elapsed(ByVal ee As Object, ByVal dd As Timers.ElapsedEventArgs) Handles myTimer.Elapsed
    If DTE.Solution.SolutionBuild.BuildState <> vsBuildState.vsBuildStateInProgress And DTE.Solution.SolutionBuild.LastBuildInfo <> 1 Then
        myTimer.Stop()
        DTE.ExecuteCommand("Build.Link")
    End If
End Sub
0
répondu AareP 2010-08-05 11:46:35

Je ne sais pas si c'est encore un problème et combien d'amélioration vous avez obtenu dans le menatime, mais s'il est toujours évident que msbuild ne sait pas orchestrer concurremment au sein d'un projet (chaque cpp devrait être construit séparément à moins que vous ayez quelques codegens - les codegens sont mieux déplacés à un projet séparé) vous hay devez télécharger driver development kit ou .NET SSCLI puisqu'ils ont tous les deux nmake, Construire qui sont connus pour paralyser les choses bien. SSCLI avait déjà la construction construisez setup, ne vous en souvenez pas si DDK a des échantillons de construction de do vous devez commencer à partir de zéro.

aussi un peu oldish l'article sur MSBuild la parallélisation n'entre pas dans les détails mais mentionne quelques différences entre le msbuild actuel et le msbuild + sln. Si /MP vs. / Gm était le seul problème, alors vous pourriez avoir à faire un petit script ou C# exe à éditer .fichiers proj pour la construction du labo. Ou utilisez explicitement la fonction cmd Line override dans les projets et optez pour cette option à partir d'un environnement var.

0
répondu ZXX 2010-10-25 01:33:17