首页 / 知识

关于msbuild:在Visual Studio中显示生成时间?

2023-04-16 12:31:00

Displaying build times in Visual Studio?

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

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

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

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

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

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


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


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


Visual Studio 2012-2019年

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

  • 对于C / C ++项目:

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

Build Timing更改为Yes


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


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

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


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

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


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

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

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


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

免责声明:我为IncrediBuild工作


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

enter image description here

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

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


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

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

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

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

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

如果要查看每个项目花费多少时间,则项目和解决方案→VC ++项目设置→生成时间=是。适用于所有项目;" VC ++"具有误导性。


我到这里结束了,因为我只想将日期和时间包含在构建输出中。如果其他人正在搜索类似的内容,则只需在项目"属性"→"编译"→"构建事件"下的"预构建"和/或"后构建"事件中添加echo %date% %time%


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

enter image description here


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

打开宏资源管理器,并在End Module之前粘贴以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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

从这里到这里的答案。


显示项目方法服务器

最新内容

相关内容

猜你喜欢