Affichage des heures de compilation dans Visual Studio?

177

Notre serveur de build prend trop de temps pour construire l'un de nos projets C ++. Il utilise Visual Studio 2008. Existe-t-il un moyen pour que devenv.com enregistre le temps nécessaire pour générer chaque projet dans la solution, afin que je sache sur quoi concentrer mes efforts?

Le matériel amélioré n'est pas une option dans ce cas.

J'ai essayé de définir la verbosité de sortie (sous Tools / Options / Projects and Solutions / Build and Run / MSBuild project build output verbosity). Cela ne semble pas avoir d'effet dans l'EDI.

Lors de l'exécution de MSBuild à partir de la ligne de commande (et, pour Visual Studio 2008, il doit s'agir de MSBuild v3.5), il affiche le temps total écoulé à la fin, mais pas dans l'EDI.

Je voulais vraiment un rapport de temps pour chaque projet de la solution, afin de pouvoir déterminer où le processus de construction prenait son temps.

Alternativement, puisque nous utilisons réellement NAnt pour conduire le processus de construction (nous utilisons Jetbrains TeamCity), y a-t-il un moyen pour que NAnt me dise le temps nécessaire pour chaque étape?

Roger Lipscombe
la source

Réponses:

208

Menu OutilsOptionsProjets et solutionsParamètres du projet VC ++ → La synchronisation de la construction devrait fonctionner.

JesperE
la source
81
On pourrait penser que c'est sous "Build and Run", mais nooooo, cela aurait été
trop
6
S'ils l'avaient mis là, quelqu'un d'autre se serait plaint que ce n'est pas là où ils s'attendaient à ce que ce soit. L'endroit le plus évident pour le mettre est différent selon les utilisateurs.
JesperE
4
Quel est le résultat de cela?
Colonel Panic
4
@AndreasBonini: Sous Build and Run, vous trouverez la v̱erbosité de sortie de la génération du projet MSBuild que vous pouvez définir au-dessus de Minimal pour obtenir également les horaires.
Joey
4
C'est bon pour profiler des tâches individuelles au cours d'une étape de construction, mais ne donne pas de résumés de l'ensemble de la construction.
Fernando Gonzalez Sanchez
89

Allez dans Outils → Options → Projets et solutions → Construire et exécuter → Verbosité de sortie de construction du projet MSBuild - réglé sur "Normal" ou "Détaillé", et le temps de construction apparaîtra dans la fenêtre de sortie.

Dave Moore
la source
2
Avant Visual Studio 2010, les projets Visual C ++ n'utilisent pas MSBuild, ce paramètre n'a donc aucun effet. Fonctionne bien pour d'autres types de projets, cependant.
Roger Lipscombe
24
réglé sur "Normal" au lieu de "Détaillé" suffit :)
andrecarlucci
7
Définir ceci sur Normal est en effet ce que la plupart voudraient car les paramètres du projet VC ++ -> La synchronisation de la construction affiche beaucoup trop de détails
Ghita
1
C'est exactement ce que la plupart des gens veulent - le temps total, et non pas que ClCompile ait pris 22424ms dans l'un des projets. Ctrl + Q, compilez et exécutez <Entrée>, et changez d'abord "minimal" en "normal".
Tomasz Gandor
37

Visual Studio 2012-2019

  • Pour les projets MSBuild (par exemple tous les projets .Net):
    Cliquez sur Tools -> Optionspuis sélectionnez Projects and Solutions -> Build and Run. Changer MSBuild project build output verbosityen Normal. Ainsi, il affichera le temps écoulé dans chaque projet de solution qu'il crée. Mais il n'y a malheureusement pas de temps écoulé sur tout le projet. Vous verrez également l'horodatage du démarrage de la construction

  • Projet FOR C / C ++:

Cliquez Tools -> Optionspuis sélectionnez Projects and Solutions -> VC++ Project Settings.

Changer Build Timingen Yes.

Sébastien
la source
4
La solution que vous avez proposée fonctionne également pour moi sur VS 2015 pour un projet C ++. De plus, je choisis d'utiliser cette solution au lieu de Build Timingcar elle affiche uniquement le temps total.
Ou B
1
Aucun changement avec VS2019. Le "temps écoulé" total est affiché pour tous les projets MSBuild (y compris C / C ++).
Farway le
9

Pour Visual Studio 2012, vous pouvez utiliser l' extension Build Monitor .

Oliver
la source
1
Vous pouvez également l'utiliser pour Visual Studio 2013 et 2015.
Shad
7

Outils-> Options-> Projets et solutions-> Construire et exécuter->

Définissez «La verbosité de sortie de la génération de projet MSBuild» de «Minimal» à «Normal»

RaaFFC
la source
7

J'ai créé une extension pour mesurer les temps de construction et présenter l'ordre des événements dans un graphique: Visual Studio Build Timer .

entrez la description de l'image ici

Il est disponible sur le marché de Visual Studio et fonctionne pour VS2015, VS2017 et VS2019.

Je trouve la présentation visuelle très utile. En plus de montrer quels projets prennent plus de temps, il montre également les dépendances entre eux, c'est-à-dire les projets qui attendent que les autres soient terminés avant de commencer. De cette façon, vous pouvez repérer les goulots d'étranglement dans la construction et voir quelles dépendances doivent être rompues afin d'augmenter la parallélisation de votre construction.

opétroch
la source
3
Pourriez-vous s'il vous plaît le mettre à niveau pour prendre en charge VS 2019
Konstantin Chernov
3
Je suis un peu occupé ces jours-ci, mais c'est dans mes plans.
opetroch
6

Si vous êtes bloqué sur VS2005, vous pouvez utiliser le plugin vs-build-timer . À la fin d'une construction, il affiche le temps total pris et un résumé (facultatif) de chacune des durées du projet.

Avertissement; Je l'ai écrit. Et oui, j'ai besoin de créer un installateur ... un jour!

MattyT
la source
Votre installateur est-il disponible
Martin
4

Si vous souhaitez visualiser votre build, vous pouvez utiliser IncrediBuild. IncrediBuild est maintenant disponible en mode autonome (non distribué mais pour une utilisation uniquement sur 8 cœurs sur votre machine locale) gratuitement dans le cadre de Visual Studio 2015 Update 1

Avis de non-responsabilité: je travaille pour IncrediBuild

buildops
la source
4

Puisque votre question implique l'utilisation de DevEnv à partir de la ligne de commande, je suggérerais également d'utiliser MSBuild (qui peut créer des fichiers .sln sans modification).

msbuild /fl /flp:Verbosity=diagnostic Your.sln

msbuild /? vous montrera d'autres options utiles pour le filelogger.

Dave Moore
la source
3

Je me suis retrouvé ici parce que je voulais juste que la date et l'heure soient incluses dans la sortie de construction. Si d'autres recherchent quelque chose de similaire, c'est aussi simple que d'ajouter echo %date% %time%aux événements Pre-build et / ou Post-build sous project, PropertiesCompileBuild Events .

Entre les week-ends
la source
2

Faites d'abord une compilation et voyez quel projet apparaît en premier dans la sortie de construction ( Ctrl+ Homedans la fenêtre de sortie). Cliquez avec le bouton droit sur ce projet → Propriétés du projetCompilerÉvénements de constructionPré-construction . Et echo ###########%date% %time%#############.

Donc, chaque fois que vous voyez les résultats de la construction (ou pendant la construction), faites Ctrl+ Homedans la fenêtre de sortie. Et quelque part dans cette zone, l'heure et la date regardent votre visage!

Oh et vous pourriez finir par ajouter ces détails à de nombreux projets car l'ordre de construction peut changer :)


J'ai trouvé une meilleure solution! ###

OutilsOptionsProjets et solutionsConstruire et exécuterVerbosité de sortie de la génération de projet MSBuild = Normal (ou supérieur à Minimal ). Cela ajoute l'heure au début / en haut de la fenêtre de sortie. Ctrl+Home dans la fenêtre de sortie devrait faire.

Si nous voulons voir combien de temps chaque projet prend, alors Projets & SolutionsParamètres du projet VC ++Calendrier de construction = oui . Il est applicable à tous les projets; "VC ++" est trompeur.

Nuages ​​bleus
la source
1

Si vous souhaitez appeler un programme externe capable de suivre vos temps de construction totaux, vous pouvez utiliser la solution suivante pour VS 2010 (et peut-être plus ancienne). Le code ci-dessous utilise CTime de Casey Muratori. Bien sûr, vous pouvez également l'utiliser pour simplement imprimer le temps de construction.

Ouvrez l'explorateur de macros et collez ce qui suit avant End Module:

Dim buildStart As Date
Private Sub RunCtime(ByVal StartRatherThanEnd As Boolean)
    Dim Arg As String
    Dim psi As New System.Diagnostics.ProcessStartInfo("ctime.exe")
    If StartRatherThanEnd Then
        psi.Arguments = "-begin"
    Else
        psi.Arguments = "-end"
    End If
    psi.Arguments += " c:\my\path\build.ctm"
    psi.RedirectStandardOutput = False
    psi.WindowStyle = ProcessWindowStyle.Hidden
    psi.UseShellExecute = False
    psi.CreateNoWindow = True
    Dim process As System.Diagnostics.Process
    process = System.Diagnostics.Process.Start(psi)
    Dim myOutput As System.IO.StreamReader = process.StandardOutput
    process.WaitForExit(2000)
    If process.HasExited Then
        Dim output As String = myOutput.ReadToEnd
        WriteToBuildWindow("CTime output: " + output)
    End If
End Sub

Private Sub BuildEvents_OnBuildBegin(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildBegin
    WriteToBuildWindow("Build started!")
    buildStart = Date.Now
    RunCtime(True)
End Sub

Private Sub BuildEvents_OnBuildDone(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildDone
    Dim buildTime = Date.Now - buildStart
    WriteToBuildWindow(String.Format("Total build time: {0} seconds", buildTime.ToString))
    RunCtime(False)
End Sub

Private Sub WriteToBuildWindow(ByVal message As String)
    Dim win As Window = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput)
    Dim ow As OutputWindow = CType(win.Object, OutputWindow)
    If (Not message.EndsWith(vbCrLf)) Then
        message = message + vbCrLf
    End If
    ow.OutputWindowPanes.Item("Build").OutputString(message)
End Sub

Réponse prise d' ici et d' ici .

Andreas Haferburg
la source
1

Options -> Projets et solutions -> Paramètres de projet VC ++ -> Calendrier de construction

entrez la description de l'image ici

Wesam
la source