Отображение времени сборки в Visual Studio?


177

Наш сервер сборки занимает слишком много времени, чтобы построить один из наших проектов C ++. Он использует Visual Studio 2008. Есть ли способ получить devenv.com для регистрации времени, затраченного на создание каждого проекта в решении, чтобы я знал, на чем сфокусировать свои усилия?

Улучшенное оборудование не вариант в этом случае.

Я попытался установить выходную детализацию (в меню Инструменты / Параметры / Проекты и решения / Построить и запустить / MSBuild - подробность сборки проекта). Похоже, это не имеет никакого эффекта в IDE.

При запуске MSBuild из командной строки (а для Visual Studio 2008 это должен быть MSBuild v3.5), он отображает общее время, прошедшее в конце, но не в IDE.

Я действительно хотел получить отчет по каждому проекту решения, на который уходит время, чтобы я мог выяснить, где процесс сборки занимает свое время.

В качестве альтернативы, поскольку мы фактически используем NAnt для управления процессом сборки (мы используем Jetbrains TeamCity), есть ли способ заставить NAnt сообщить мне время, затраченное на каждый шаг?

Ответы:


205

Инструменты меню → ПараметрыПроекты и решенияНастройки проекта VC ++Время сборки должно работать.


78
Можно было бы подумать, что это в разделе «Построй и беги», но оооочень, это было бы просто
Томас Бонини

6
Если бы они поместили это туда, кто-то другой пожаловался бы, что это не то место, где они ожидают этого. Самое очевидное место, чтобы положить это по-разному для разных пользователей.
JesperE

4
Какой выход этого?
полковник Паник

4
@AndreasBonini: в разделе « Сборка и запуск» вы найдете выходную сборку сборки проекта MSBuild, которую вы также можете установить выше минимальной, чтобы получить время.
Джои

4
Это хорошо для профилирования отдельных задач на этапе сборки, но не дает сводки всей сборки.
Фернандо Гонсалес Санчес

88

Выберите «Инструменты» → «Параметры» → «Проекты и решения» → «Построить и запустить» → «Подробность сборки сборки проекта MSBuild» - установите «Нормальный» или «Детальный», и время сборки появится в окне вывода.


2
До Visual Studio 2010 проекты Visual C ++ не использовали MSBuild, поэтому этот параметр не действует. Работает нормально для других типов проектов, хотя.
Роджер Липскомб

23
достаточно установить «Normal» вместо «
Detail»

7
Установка этого значения на Normal - это действительно то, чего больше всего хотелось бы, потому что Настройки проекта VC ++ -> Время сборки показывают слишком много деталей
Ghita

1
Это именно то, чего хочет большинство людей - общее время, а не то, что ClCompile занял 22424 мс в одном из проектов. Ctrl + Q, построить и запустить <Enter>, и изменить сначала «минимальный» на «нормальный».
Томаш Гандор

36

Visual Studio 2012 - 2019

  • Для проектов MSBuild (например, всех .Net-проектов):
    Нажмите, Tools -> Optionsа затем выберите Projects and Solutions -> Build and Run. Изменить MSBuild project build output verbosityна Normal. Таким образом, он будет отображать прошедшее время в каждом построенном им проекте решения. Но, к сожалению, нет суммы истекшего времени по всему проекту. Вы также увидите метку времени начала сборки

  • FOR C / C ++ Project:

Нажмите Tools -> Optionsи затем выберите Projects and Solutions -> VC++ Project Settings.

Изменить Build TimingнаYes .


4
Предлагаемое вами решение работает для меня на VS 2015 и для проекта C ++. Кроме того, я решил использовать это решение вместо того, Build Timingчтобы отображать только общее время.
Или B

1
Без изменений с VS2019. Общее «истекшее время» отображается для всех проектов MSBuild (включая C / C ++).
Фаруэй


6

Если вы застряли на VS2005, вы можете использовать плагин vs-build-timer . По завершении сборки он показывает общее время и (необязательно) сводку по каждой продолжительности проекта.

Отказ от ответственности; Я это написал. И да, мне нужно создать установщик ... однажды!


Ваш установщик доступен
Мартин,

6

Сервис-> Параметры-> Проекты и решения-> Построить и запустить->

Установите для "MSBuild Project buildbobity" значение "Минимальное" - "Нормальное".


4

Если вы хотите визуализировать вашу сборку, вы можете использовать IncrediBuild. IncrediBuild теперь доступен в автономном режиме (не распространяется, но используется только на 8 ядрах на вашем локальном компьютере) бесплатно как часть обновления 1 для Visual Studio 2015

Отказ от ответственности: я работаю на IncrediBuild


4

Поскольку ваш вопрос связан с использованием DevEnv из командной строки, я бы также предложил использовать MSBuild (который может создавать файлы .sln без изменений).

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

msbuild /? покажет вам другие полезные опции для filelogger.


4

Я создал расширение для измерения времени сборки и представления порядка событий на графике: Visual Studio Build Timer .

введите описание изображения здесь

Он доступен на рынке Visual Studio и работает для VS2015, VS2017 и VS2019.

Я нахожу визуальное представление весьма полезным. Помимо отображения того, какие проекты занимают больше времени, он также показывает зависимости между ними, то есть проекты, которые ждут завершения других, прежде чем начнутся. Таким образом, вы можете обнаружить узкие места в сборке и увидеть, какие зависимости необходимо разрушить, чтобы увеличить распараллеливание вашей сборки.


3
Не могли бы вы обновить его для поддержки VS 2019
Константин Чернов

3
Я немного занят в эти дни, но это в моих планах.
opetroch

2

Я оказался здесь, потому что просто хотел, чтобы дата и время были включены в выходные данные сборки. Если другие ищут что-то похожее, это так же просто, как добавить echo %date% %time%к событиям Pre-build и / или Post-build в проекте, PropertiesCompileBuild Events .


2

Сначала выполните сборку и посмотрите, какой проект появляется первым в выводе сборки ( Ctrl+ Homeв окне вывода). Щелкните правой кнопкой мыши этот проект → Свойства проектаКомпиляцияСобытия сборкиПредварительная сборка . И echo ###########%date% %time%#############.

Поэтому каждый раз, когда вы видите результаты сборки (или во время сборки), делайте Ctrl+Home в окне вывода. И где-то в этом месте время и дата смотрят на тебя!

Да, и вы можете добавить эти детали во многие проекты, поскольку порядок сборки может измениться :)


Я нашел лучшее решение! ###

ИнструментыПараметрыПроекты и решенияПостроить и запуститьMSBuild - подробность сборки проекта = Normal (или выше Minimal ). Это добавляет время в начало / верх окна вывода. Ctrl+ Homeв окне вывода надо делать.

Если мы хотим узнать, сколько времени занимает каждый проект, тогда Проекты и решенияНастройки проекта VC ++Время сборки = да . Это применимо ко всем проектам; «VC ++» вводит в заблуждение.


1

Если вы хотите вызвать внешнюю программу, которая может отслеживать общее время сборки, вы можете использовать следующее решение для VS 2010 (и, возможно, старше). Код ниже использует CTime от Casey Muratori. Конечно, вы также можете использовать его, чтобы просто напечатать время сборки.

Откройте проводник макросов и вставьте следующее 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

Ответ взят здесь и здесь .


1

Параметры -> Проекты и решения -> Настройки проекта VC ++ -> Время сборки

введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.