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

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

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

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

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

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

有帮助吗?

解决方案

菜单 工具选项项目与解决方案VC++项目设置构建时序 应该管用。

其他提示

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

Visual Studio 2012 至 2017

  • 对于 MSBuild 项目(例如所有.Net项目):
    点击 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.

对于 Visual Studio 2012,您可以使用 构建监视器 扩大。

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

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

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

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

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

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

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

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

免责声明:我在 IncrediBuild 工作

我最终来到这里是因为我只想将日期和时间包含在构建输出中。如果其他人正在搜索类似的东西,那么就像添加一样简单 echo %date% %time% 项目下的预构建和/或构建后事件, 特性编译构建活动.

首先进行构建并查看哪个项目首先出现在构建输出中(控制键 + 在输出窗口中)。右键单击该项目→ 项目属性编译构建活动预构建. 。和 echo ###########%date% %time%#############.

因此,每次您看到构建结果(或在构建过程中)时,都会执行以下操作 控制键 + 在输出窗口中。在那个区域的某个地方,时间和日期就盯着你的脸!

哦,您最终可能会将这些详细信息添加到许多项目中,因为构建顺序可能会发生变化:)


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

工具选项项目与解决方案构建并运行MSBuild 项目构建输出详细信息 = 正常(或以上 最小)。这会在输出窗口的开头/顶部添加时间。 控制键 + 在输出窗口中应该做的。

如果我们想看看每个项目花费了多少时间 项目与解决方案VC++项目设置构建时间 = 是. 。适用于所有项目;“VC++”具有误导性。

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

答案取自 这里这里.

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

enter image description here

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

enter image description here

它可在 Visual Studio 市场上找到,适用于 VS2015 和 VS2017。

我发现视觉呈现非常有帮助。除了显示哪些项目需要更长的时间外,它还显示它们之间的依赖关系,即等待其他人完成才开始的项目。通过这种方式,您可以发现构建中的瓶颈,并查看需要打破哪些依赖关系才能提高构建的并行度。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top