Wyświetlanie czasów kompilacji w programie Visual Studio?

177

Nasz serwer kompilacji trwa zbyt długo, aby zbudować jeden z naszych projektów w języku C ++. Korzysta z programu Visual Studio 2008. Czy jest jakiś sposób, aby devenv.com rejestrowało czas potrzebny na zbudowanie każdego projektu w rozwiązaniu, aby wiedzieć, na czym mam skoncentrować swoje wysiłki?

Ulepszony sprzęt nie wchodzi w grę w tym przypadku.

Próbowałem ustawić szczegółowość danych wyjściowych (w obszarze Narzędzia / Opcje / Projekty i rozwiązania / Kompiluj i uruchom / Szczegółowość danych wyjściowych kompilacji projektu MSBuild). Wydaje się, że nie ma to żadnego wpływu na IDE.

Podczas uruchamiania programu MSBuild z wiersza polecenia (a w przypadku programu Visual Studio 2008 musi to być MSBuild v3.5) wyświetla łączny czas, który upłynął na końcu, ale nie w środowisku IDE.

Naprawdę potrzebowałem raportu z analizy czasu dla każdego projektu w rozwiązaniu, aby móc dowiedzieć się, gdzie proces kompilacji zajmuje dużo czasu.

Alternatywnie, skoro faktycznie używamy NAnt do kierowania procesem budowania (używamy Jetbrains TeamCity), czy istnieje sposób, aby NAnt podawał mi czas potrzebny na każdy krok?

Roger Lipscombe
źródło

Odpowiedzi:

205

Menu NarzędziaOpcjeProjekty i rozwiązaniaUstawienia projektu VC ++Czas kompilacji powinien działać.

JesperE
źródło
78
Można by pomyśleć, że jest w sekcji „Build and Run”, ale nieeeee, to byłoby zbyt proste
Thomas Bonini,
6
Gdyby to tam umieścili, ktoś inny narzekałby, że nie jest tam, gdzie by się tego spodziewali. Najbardziej oczywiste miejsce, w którym można to umieścić, jest inne dla różnych użytkowników.
JesperE
4
Jaki jest tego wynik?
Colonel Panic
4
@AndreasBonini: W obszarze Kompiluj i uruchamiaj znajdziesz v̱erbosity danych wyjściowych kompilacji projektu MSBuild, które możesz ustawić powyżej Minimalne, aby również uzyskać czasy.
Joey
4
Jest to dobre do profilowania poszczególnych zadań na etapie kompilacji, ale nie daje podsumowań całej kompilacji.
Fernando Gonzalez Sanchez
88

Przejdź do Narzędzia → Opcje → Projekty i rozwiązania → Kompiluj i uruchamiaj → Szczegółowość danych wyjściowych kompilacji projektu MSBuild - ustaw na „Normalny” lub „Szczegółowy”, a czas kompilacji pojawi się w oknie wyników.

Dave Moore
źródło
2
Przed Visual Studio 2010 projekty Visual C ++ nie używają programu MSBuild, więc to ustawienie nie ma wpływu. Jednak działa dobrze w przypadku innych typów projektów.
Roger Lipscombe
23
wystarczy ustawić na „Normalny” zamiast „Szczegółowy” :)
andrecarlucci
7
Ustawienie tego na Normalne jest rzeczywiście tym, czego większość by chciała, ponieważ Ustawienia projektu VC ++ -> Czas kompilacji pokazuje zbyt wiele szczegółów
Ghita
1
To jest dokładnie to, czego chce większość ludzi - całkowity czas, a nie to, że ClCompile zajęło 22424 ms w jednym z projektów. Ctrl + Q, zbuduj i uruchom <Enter> i zmień najpierw „minimalne” na „normalne”.
Tomasz Gandor
36

Visual Studio 2012-2019

  • W przypadku projektów MSBuild (np. Wszystkie projekty .Net):
    kliknij, Tools -> Optionsa następnie wybierz Projects and Solutions -> Build and Run. Zmień MSBuild project build output verbosityna Normal. Dlatego będzie wyświetlać upływ czasu w każdym budowanym projekcie rozwiązania. Niestety, w całym projekcie nie ma sumy czasu, który upłynął. Zobaczysz również sygnaturę czasową rozpoczęcia budowy

  • DLA PROJEKTU C / C ++:

Kliknij, Tools -> Optionsa następnie wybierz Projects and Solutions -> VC++ Project Settings.

Zmień Build Timingna Yes.

Sebastian
źródło
4
Rozwiązanie, które zaproponowałeś, działa dla mnie również w VS 2015 dla projektu C ++. Wybieram również to rozwiązanie zamiast, Build Timingponieważ wyświetla ono tylko całkowity czas.
Lub B
1
Bez zmian z VS2019. Całkowity „czas, który upłynął” jest wyświetlany dla wszystkich projektów MSBuild (w tym C / C ++).
Farway
9

W przypadku programu Visual Studio 2012 można użyć rozszerzenia Build Monitor .

Oliver
źródło
1
Możesz go również użyć dla Visual Studio 2013 i 2015.
Shad
6

Jeśli utkniesz na VS2005, możesz użyć wtyczki vs-build-timer . Po zakończeniu kompilacji pokazuje całkowity czas potrzebny i (opcjonalnie) podsumowanie każdego czasu trwania projektu.

Zrzeczenie się; Napisałem to. I tak, muszę stworzyć instalator ... pewnego dnia!

MattyT
źródło
Czy twój instalator jest dostępny
Martin
6

Narzędzia-> Opcje-> Projekty i rozwiązania-> Kompiluj i uruchamiaj->

Ustaw „Szczegółowość danych wyjściowych kompilacji projektu MSBuild” z „Minimalne” na „Normalne”

RaaFFC
źródło
4

Jeśli chcesz zwizualizować swoją kompilację, możesz użyć IncrediBuild. IncrediBuild jest teraz dostępny w trybie autonomicznym (nie jest dystrybuowany, ale do użytku tylko na 8 rdzeniach na komputerze lokalnym) za darmo jako część Visual Studio 2015 Update 1

Zastrzeżenie: pracuję dla IncrediBuild

buildops
źródło
4

Ponieważ twoje pytanie dotyczy używania DevEnv z wiersza poleceń, sugerowałbym również użycie programu MSBuild (który może budować pliki .sln bez modyfikacji).

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

msbuild /? pokaże inne przydatne opcje dla fileloggera.

Dave Moore
źródło
4

Stworzyłem rozszerzenie do mierzenia czasów kompilacji i przedstawiania kolejności zdarzeń na wykresie: Visual Studio Build Timer .

wprowadź opis obrazu tutaj

Jest dostępny na platformie Visual Studio Market i działa dla VS2015, VS2017 i VS2019.

Uważam, że prezentacja wizualna jest bardzo pomocna. Oprócz pokazania, które projekty trwają dłużej, pokazuje również zależności między nimi, tj. Projekty, które czekają na ukończenie innych, zanim rozpoczną. W ten sposób możesz dostrzec wąskie gardła w kompilacji i zobaczyć, jakie zależności muszą zostać zerwane, aby zwiększyć równoległość kompilacji.

opetroch
źródło
3
Czy mógłbyś go zaktualizować, aby obsługiwał VS 2019
Konstantin Chernov
3
Jestem ostatnio trochę zajęty, ale mam to w planach.
opetroch
2

Skończyło się tutaj, ponieważ chciałem po prostu uwzględnić datę i godzinę w wyniku kompilacji. Jeśli inni szukają czegoś podobnego, wystarczy dodać je echo %date% %time%do wydarzeń przed kompilacją i / lub po kompilacji w ramach projektu, WłaściwościKompilujBuduj zdarzenia .

W międzyczasie w weekendy
źródło
2

Najpierw wykonaj kompilację i zobacz, który projekt pojawia się jako pierwszy w danych wyjściowych kompilacji ( Ctrl+ Homew oknie danych wyjściowych). Kliknij prawym przyciskiem myszy ten projekt → Właściwości projektuskompilowaćBuild WydarzeniaPre-build . A echo ###########%date% %time%#############.

Więc za każdym razem, gdy zobaczysz wyniki kompilacji (lub podczas kompilacji), wykonaj Ctrl+ Homew oknie wyjściowym. A gdzieś w tej okolicy godzina i data patrzą na twoją twarz!

Aha i możesz skończyć dodając te szczegóły do ​​wielu projektów, ponieważ kolejność kompilacji może się zmienić :)


Znalazłem lepsze rozwiązanie! ###

NarzędziaOpcjeProjekty i rozwiązaniaKompiluj i uruchamiaj → Szczegółowość danych wyjściowych kompilacji projektu MSBuild = Normalna (lub wyższa niż Minimalna ). Dodaje czas na początku / na górze okna wyjściowego. Ctrl+ Homew oknie wyjściowym powinno wystarczyć.

Jeśli chcemy zobaczyć, ile czasu zajmuje każdy projekt, wtedy Projekty i rozwiązaniaUstawienia projektu VC ++Czas kompilacji = tak . Ma zastosowanie do wszystkich projektów; „VC ++” jest mylące.

Niebieskie chmury
źródło
1

Jeśli chcesz wywołać zewnętrzny program, który może śledzić całkowity czas kompilacji, możesz użyć następującego rozwiązania dla VS 2010 (i może starszego). Poniższy kod wykorzystuje CTime autorstwa Casey Muratori. Oczywiście można go również użyć do wydrukowania czasu kompilacji.

Otwórz eksplorator makr i wklej wcześniej 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

Odpowiedź zaczerpnięta stąd i tutaj .

Andreas Haferburg
źródło
1

Opcje -> Projekty i rozwiązania -> Ustawienia projektu VC ++ -> Czas kompilacji

wprowadź opis obrazu tutaj

Wesam
źródło