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

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

从这里到这里的答案。


推荐阅读

    纯命令行linux服务器?

    纯命令行linux服务器?,密码,服务,系统,命令,终端,地址,百度,情况,状态,公共,

    linux显示操作命令?

    linux显示操作命令?,系统,工作,地址,信息,管理,命令,目录,基础,工具,标准,lin

    linux命令行显示路径?

    linux命令行显示路径?,系统,数据,信息,命令,工作,时间,标准,文件,目录,名称,l

    linux显示详细命令?

    linux显示详细命令?,工作,系统,信息,地址,命令,标准,数据,目录,文件,名称,执

    linux显示上一个命令?

    linux显示上一个命令?,信息,机器人,人工智能,第一,地方,工具,在线,网站,代

    检查linux服务器命令?

    检查linux服务器命令?,系统,信息,状态,情况,时间,工具,网络,环境,服务,电脑,

    linux满屏显示命令?

    linux满屏显示命令?,工具,系统,服务,电脑,网络,技术,信息,数据,上会,软件,如

    linux打包项目命令?

    linux打包项目命令?,项目,文件,命令,软件,数字,系统,名称,工具,目录,格式,Lin

    显示linux时间命令?

    显示linux时间命令?,时间,系统,信息,一致,命令,文件,终端,目录,选项,参数,lin

    linux项目更新命令行?

    linux项目更新命令行?,工作,地址,系统,数据,信息,项目,标准,电脑,目录,命令,l

    linux命令刷新显示?

    linux命令刷新显示?,系统,工作,最新,地址,命令,异常,分析,工具,信息,软件,Lin

    linux服务器域名命令?

    linux服务器域名命令?,地址,信息,系统,网络,服务,环境,名称,网站,管理,电脑,l

    linux显示最多的命令?

    linux显示最多的命令?,系统,情况,信息,数据,工具,电脑,状态,时间,分析,命令,

    linux命令高亮显示?

    linux命令高亮显示?,系统,信息,命令,电脑,地址,代码,情况,分析,位置,文件,Lin

    linux服务器命令框?

    linux服务器命令框?,系统,情况,状态,信息,数据,软件,指标,服务,在线,工具,lin

    服务器linux命令教程?

    服务器linux命令教程?,系统,地址,密码,网络,设备,工作,服务,标准,连续,管理,

    linux显示隐藏命令?

    linux显示隐藏命令?,系统,电脑,档案,工具,一致,生产,文件夹,文件,命令,开头,l

    linux服务器分区命令?

    linux服务器分区命令?,系统,管理,信息,设备,时间,命令,基础,首次,平均,情况,l

    linux显示错误命令?

    linux显示错误命令?,信息,系统,电脑,状态,时间,环境,命令,搜狐,密码,异常,虚

    linux逐行显示命令?

    linux逐行显示命令?,标准,信息,系统,工作,地址,命令,实时,名称,文件,目录,Lin