189

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

在这种情况下,改进硬件不是一种选择。

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

从命令行运行 MSBuild 时(对于 Visual Studio 2008,它需要是 MSBuild v3.5),它会在最后显示经过的总时间,但不会在 IDE 中显示。

我真的很想为解决方案中的每个项目提供一份耗时的报告,以便我可以弄清楚构建过程在哪里花费了时间。

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

4

13 回答 13

217

菜单工具选项项目和解决方案VC++ 项目设置构建时间应该可以工作。

于 2008-09-25T10:34:16.823 回答
101

转到工具 → 选项 → 项目和解决方案 → 构建和运行 → MSBuild 项目构建输出详细程度 - 设置为“正常”或“详细”,构建时间将出现在输出窗口中。

于 2008-09-17T11:22:16.720 回答
40

视觉工作室 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

于 2014-08-08T12:38:36.690 回答
16

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

在此处输入图像描述

它可在视觉工作室市场获得,适用于 VS2015、VS2017 和 VS2019。

除了显示哪些项目需要更长的时间之外,该图表还有效地显示了它们之间的依赖关系,即需要等待其他项目的项目,这有助于确定需要打破哪些依赖关系以增加构建的并行化。

于 2019-01-11T10:49:36.167 回答
9

对于 Visual Studio 2012,您可以使用Build Monitor扩展。

于 2013-07-08T12:16:57.033 回答
7

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

将“MSBuild 项目构建输出详细程度”从“Minimal”设置为“Normal”

于 2013-01-16T12:14:36.550 回答
6

如果你卡在 VS2005 上,你可以使用vs-build-timer 插件。在构建完成时,它会显示所花费的总时间和每个项目持续时间的(可选)摘要。

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

于 2010-04-07T04:29:02.460 回答
5

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

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

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

于 2008-09-17T11:36:27.950 回答
5

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

免责声明:我为 IncrediBuild 工作

于 2015-12-06T14:38:34.477 回答
4

我最终来到这里是因为我只想在构建输出中包含日期和时间。如果其他人正在搜索类似的东西,就像添加echo %date% %time%到项目下的 Pre-build 和/或 Post-build 事件一样简单,PropertiesCompileBuild Events

于 2015-03-19T14:02:18.993 回答
4

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

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

哦,由于构建顺序可能会发生变化,您最终可能会将这些细节添加到许多项目中:)


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

ToolsOptionsProjects & SolutionsBuild and RunMSBuild project build output verbosity = Normal (或高于Minimal)。这会在输出窗口的开头/顶部添加时间。Ctrl+Home在输出窗口应该做。

如果我们想查看每个项目需要多少时间,那么Projects & SolutionsVC++ Project SettingsBuild Timing = yes。适用于所有项目;“VC++”具有误导性。

于 2015-08-05T08:34:49.980 回答
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

答案取自这里这里

于 2016-05-10T12:49:12.950 回答
1

选项 -> 项目和解决方案 -> VC++ 项目设置 -> 构建时间

在此处输入图像描述

于 2018-07-03T10:39:34.323 回答