我们的构建服务器花费太长时间来构建我们的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年
单击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。
它在Visual Studio市场上可用,并且适用于VS2015和VS2017。
我发现视觉演示非常有帮助。 除了显示需要较长时间的项目外,它还显示了它们之间的依赖关系,即,在其他项目开始之前等待其他项目完成的项目。 这样,您可以发现构建中的瓶颈,并查看需要打破哪些依赖关系才能增强构建的并行化。
首先进行构建,然后查看哪个项目首先出现在构建输出中(输出窗口中的Ctrl + Home)。右键单击该项目→项目属性→编译→构建事件→预构建。和echo ###########%date% %time%#############。
因此,每次看到构建结果时(或在构建过程中),在输出窗口中都执行Ctrl + Home。在该区域的某个地方,时间和日期注视着您!
哦,随着构建顺序的改变,您可能最终将这些详细信息添加到许多项目中:)
我找到了更好的解决方案! ###
工具→选项→项目和解决方案→生成并运行→MSBuild项目生成输出的详细程度=正常(或最小)。这会将时间添加到输出窗口的开始/顶部。在输出窗口中应该执行Ctrl + Home。
如果要查看每个项目花费多少时间,则项目和解决方案→VC ++项目设置→生成时间=是。适用于所有项目;" VC ++"具有误导性。
我到这里结束了,因为我只想将日期和时间包含在构建输出中。如果其他人正在搜索类似的内容,则只需在项目"属性"→"编译"→"构建事件"下的"预构建"和/或"后构建"事件中添加echo %date% %time%。
选项->项目和解决方案-> VC ++项目设置->构建时间
如果要调用可以跟踪总构建时间的外部程序,则可以对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 |
从这里到这里的答案。