在Visual Studio中显示构建时间?


177

我们的构建服务器花费太长时间来构建我们的C ++项目之一。它使用Visual Studio2008。是否有任何方法可以使devenv.com记录在解决方案中构建每个项目所花费的时间,以便使我知道将精力集中在哪里?

在这种情况下,不能选择改进的硬件。

我尝试设置输出详细程度(在“工具/选项/项目和解决方案/构建和运行/ MSBuild项目构建输出详细程度”下)。这似乎在IDE中没有任何作用。

从命令行运行MSBuild时(对于Visual Studio 2008,它必须为MSBuild v3.5),它显示末尾经过的总时间,但不显示IDE中的时间。

我确实想要解决方案中每个项目的耗时报告,以便我可以弄清楚构建过程在哪里花费了时间。

或者,由于我们实际上使用NAnt来驱动构建过程(我们使用Jetbrains TeamCity),是否有办法让NAnt告诉我每个步骤花费的时间?

Answers:


205

菜单工具选项项目和解决方案VC ++项目设置生成时序应起作用。


78
有人会认为它是在“构建和运行”下进行的,但是没有,这很简单
Thomas Bonini 2010年

6
如果他们把它放在那里,其他人可能会抱怨它不在他们期望的位置。对于不同的用户,最明显的放置位置是不同的。
JesperE

4
这是什么输出?
Panic Panic

4
@AndreasBonini:在“ 构建和运行”您会发现MSBuild项目的构建输出效率,您也可以将其设置为“ 最小”,以获取时间。
乔伊

4
这对于在构建阶段对单个任务进行概要分析很有用,但不会给出整个构建的摘要。
费尔南多·冈萨雷斯·桑切斯

88

转到工具→选项→项目和解决方案→生成并运行→MSBuild项目生成输出详细信息-设置为“正常”或“详细”,并且生成时间将出现在输出窗口中。


2
在Visual Studio 2010之前,Visual C ++项目不使用MSBuild,因此此设置无效。但是,对于其他项目类型也可以正常工作。
罗杰·利普斯科姆2009年

23
设置为“普通”而不是“详细”就足够了:)
andrecarlucci 2011年

7
实际上,大多数人都希望将其设置为Normal,因为VC ++ Project Settings-> Build Timing显示了太多细节
Ghita 2012年

1
这正是大多数人想要的-总时间,而不是ClCompile在其中一个项目中花费了22424ms。Ctrl + Q,构建并运行<Enter>,然后将第一个“最小”更改为“正常”。
Tomasz Gandor

35

Visual Studio 2012-2019年

  • 对于MSBuild项目(例如,所有.Net-Projects):
    单击Tools -> Options,然后选择Projects and Solutions -> Build and Run。更改MSBuild project build output verbosityNormal。因此它将在其构建的每个解决方案项目中显示“经过的时间”。但是不幸的是,所有项目都没有经过时间总和。您还将看到构建开始时间戳

  • 对于C / C ++项目:

单击Tools -> Options,然后选择Projects and Solutions -> VC++ Project Settings

更改Build TimingYes


4
您提供的解决方案也适用于VS 2015的C ++项目。另外,我选择使用此解决方案,而不是Build Timing因为它仅显示总时间。
或B

1
VS2019不变。显示所有MSBuild项目(包括C / C ++)的总“经过时间”。


6

如果您坚持使用VS2005,则可以使用vs-build-timer插件。在构建完成时,它显示了花费的总时间以及每个项目工期的(可选)摘要。

免责声明;我写的。是的,我需要创建一个安装程序……一天!


您的安装程序可用吗?
马丁(Martin)

6

工具->选项->项目和解决方案->构建并运行->

将“ MSBuild项目构建输出详细程度”从“最小”设置为“正常”


4

如果要可视化构建,可以使用IncrediBuild。作为Visual Studio 2015 Update 1的一部分,IncrediBuild现在可以以独立模式免费使用(未分发,但只能在本地计算机上的8个内核上使用)

免责声明:我为IncrediBuild工作


4

由于您的问题涉及从命令行使用DevEnv,因此我也建议您使用MSBuild(无需修改即可构建.sln文件)。

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

msbuild /? 将为您显示文件记录器的其他有用选项。


4

我创建了一个扩展来测量构建时间并在图形中显示事件的顺序:Visual Studio Build Timer

在此处输入图片说明

它在Visual Studio市场上可用,并且适用于VS2015,VS2017和VS2019。

我发现视觉演示非常有帮助。除了显示哪些项目需要更长的时间,它还显示了它们之间的依赖关系,即,在其他项目开始之前,它们会等待其他项目完成。这样,您可以发现构建中的瓶颈,并查看需要打破哪些依赖关系才能增强构建的并行化。


3
您能否将其升级以支持VS 2019
Konstantin Chernov

3
这些天我有点忙,但这是我的计划。
opetroch '19

2

我到这里结束了,因为我只想将日期和时间包含在构建输出中。如果其他人要搜索类似的东西,则echo %date% %time%只需将其添加到项目PropertiesCompileBuild Events下的Pre-build和/或Post-build事件中即可。


2

首先执行构建,然后查看哪个项目首先出现在构建输出中(输出窗口中的Ctrl+ Home)。右键单击该项目→ 项目属性编译构建事件预构建。和echo ###########%date% %time%#############

因此,每次看到构建结果时(或在构建过程中),在输出窗口中都会执行Ctrl+ Home。在该区域的某个地方,时间和日期注视着您!

哦,随着构建顺序的改变,您可能最终将这些详细信息添加到许多项目中:)


我找到了更好的解决方案!###

工具选项项目和解决方案生成并运行MSBuild项目生成输出的详细程度 =正常(或高于最小)。这会将时间添加到输出窗口的开始/顶部。Ctrl+ Home应该在输出窗口中执行。

如果我们想查看每个项目需要多少时间,则可以选择“ 项目与解决方案” →“ VC ++项目设置” →“ 构建时间” =“是”。适用于所有项目;“ VC ++”具有误导性。


1

如果要调用可以跟踪总构建时间的外部程序,则可以对VS 2010使用以下解决方案(可能更旧)。下面的代码使用Casey Muratori的CTime。当然,您也可以使用它来简单地打印构建时间。

打开宏资源管理器,然后粘贴以下内容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 ++项目设置->构建时间

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.