【问题标题】:Displaying build times in Visual Studio?在 Visual Studio 中显示构建时间?
【发布时间】:2010-09-10 01:47:41
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: visual-studio msbuild build-process


    【解决方案1】:

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

    【讨论】:

    • 有人会认为它在“构建和运行”下,但不,这很简单
    • 如果他们把它放在那里,其他人会抱怨它不是他们所期望的。对于不同的用户来说,最明显的放置位置是不同的。
    • 这个输出是什么?
    • @AndreasBonini:在 Build and Run 下,您会发现 MSBuild 项目构建输出 v̱erbosity 可以在 Minimal上方设置> 也可以获取时间。
    • 这对于在构建阶段分析单个任务很有用,但不会给出整个构建的摘要。
    【解决方案2】:

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

    【讨论】:

    • 在 Visual Studio 2010 之前,Visual C++ 项目不使用 MSBuild,因此此设置无效。不过,适用于其他项目类型。
    • 设置为“正常”而不是“详细”就足够了:)
    • 将此设置为 Normal 确实是大多数人想要的,因为 VC++ Project Settings -> Build Timing 显示了太多细节
    • 这正是大多数人想要的——总时间,而不是 ClCompile 在其中一个项目中花费了 22424 毫秒。 Ctrl+Q,编译运行,将第一个“minimal”改成“normal”。
    【解决方案3】:

    Visual Studio 2012 - 2019

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

    • FOR C/C++ 项目:

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

    Build Timing 更改为Yes

    【讨论】:

    • 您提供的解决方案也适用于 VS 2015 上的 C++ 项目。另外,我选择使用这个解决方案而不是Build Timing,因为它只显示总时间。
    • VS2019 没有变化。显示所有 MSBuild 项目(包括 C/C++)的总“已用时间”。
    【解决方案4】:

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

    它在 Visual Studio Marketplace 上有售,适用于 VS2015、VS2017 和 VS2019。

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

    【讨论】:

    • 能否升级它以支持 VS 2019
    • 这几天我有点忙,但这是我的计划。
    • 我认为这应该是首选答案。它安装并且运行良好(VS2019 版本 16.10.3)。接受的答案是 Tools->Options->... 在恕我直言,这个插件提供的结果不如这个插件。插件上的日志到文件选项可能很好......但是将它记入EXCEL很容易。
    【解决方案5】:

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

    【讨论】:

    • 您也可以将它用于 Visual Studio 2013 和 2015。
    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

      • 您的安装程序可用
      【解决方案8】:

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

      免责声明:我为 IncrediBuild 工作

      【讨论】:

        【解决方案9】:

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

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

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

        【讨论】:

          【解决方案10】:

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

          【讨论】:

            【解决方案11】:

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

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

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


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

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

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

            【讨论】:

              【解决方案12】:

              如果您想调用一个可以跟踪您的总构建时间的外部程序,您可以为 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
              

              答案取自 herehere

              【讨论】:

                【解决方案13】:

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

                【讨论】:

                  猜你喜欢
                  • 2014-02-11
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-01-07
                  • 2017-04-18
                  相关资源
                  最近更新 更多