我们知道,应用程序的构建吞吐量对开发人员的生产率是一个时间紧迫的问题。我们花了一些时间在 提高链接器吞吐量 以及VS2010中的其他领域,并将在未来的版本中继续研究如何提高总体构建吞吐量。
在这篇博文中,我们将介绍几个选项,以便使用 MSBuild公司 然后深入研究编译器和链接器。
使用MSBuild
使用IDE,可以通过设置“Tools/Options/Projects and Solutions/VC++Project Settings/Build Timings”=“Yes”来启用计时日志记录,或者将生成的详细程度从“Tools/Options/Project and Solutions/Build and Run/MSBuild Project Build output verbosity”提高到“Diagnostics”。
使用这些选项,您可以获得每个项目的性能摘要,还可以获得在目标和任务上花费时间的详细信息。这类信息非常有用,例如,当您试图计算复制任务从多个文件夹复制文件所需的时间时。
1> –全部重新生成已启动:项目:mfc应用程序,配置:调试Win32–
1> 建造开始于2010年1月12日下午5:31:58。
1> u准备清洁:
1> 正在删除文件“Debugmfc app.lastbuildstate”。
1> 初始化BuildStatus:
1> 正在创建“Debugmfc app.unsuccessfulbuild”,因为指定了“AlwaysCreate”。
1> CLC编译:
1> stdafx.cpp文件
……………
1> 儿童基金会
1> 正在生成代码…
1> 舱单:
1> 正在删除文件“Debugmfc app.exe.embed.manifest”。
1> LinkedManifest公司:
1> mfc-app.vcxproj->C:Usersuserdocumentsvisual studio 2010Projectsmfc-appDebugmfc-app.exe
1> FinalizeBuild状态:
1> 正在删除文件“Debugmfc app.unsuccessfulbuild”。
1> 触摸“Debugmfc app.lastbuildstate”。
1>
1> 项目绩效总结:
1> 17877毫秒 C:Usersuserdocumentsvisual studio 2010项目mfc-appmfc-appmfc-app.vcxproj 1个电话
1> 17877毫秒 重建 1个电话
1>
1> 目标绩效总结:
1> 0毫秒 CreateCustomManifestResourceNames 1个电话
……………
1> 630毫秒 LinkedManifest公司 1个电话
1> 956毫秒 显示 1个电话
1> 2419毫秒 链接 1个电话
1> 12738毫秒 CLC编译 1个电话
1>
1> 任务绩效总结:
1> 0毫秒 芬登路径 2个电话
……………
1> 3035毫秒 链接 2个电话
1> 12733毫秒 氯 2个电话
1>
1> 生成成功。
1>
1> 时间流逝00:00:17.89
==========全部重建:1成功,0失败,0跳过==========
这里有几个“隐藏的”未记录的开关,您可以使用它们来诊断大部分构建时间都花在哪里/如果你想知道时间花在哪里,Bt和/时间开关对你来说可能很有价值。
我们使用/Bt+和/time+对内部吞吐量运行,其中一个工具将输出计时作为输入,并生成每个组件所用时间的摘要列表。这使我们能够获得单个组件的吞吐量测量值(一个有用的工具,有人写和贡献 代码库 )
关于隐藏开关的说明:
这些开关有时是为了诊断而暴露的。它们没有文档记录,并且在将来的版本中将/可能会发生更改。请谨慎使用。
用法
· 要获得较少的详细输出,请使用“cl/Bt”或“link/time”
· 要获得更详细的输出,请使用“cl/Bt+”或“link/time+”(仅适用于VS2010)
使用编译器开关“/Bt”
直接在命令行中添加“/BT”到编译器选项,或者转到Project属性,并在“配置属性/C/C++ +命令行”中添加“/BT”选项。构建之后,突出显示的文本将告诉您在c1x中花费了多少时间( 前端编译器 )和c2( 后端编译器 )
1> –全部重新生成已启动:项目:mfc应用程序,配置:调试Win32–
1> 建造开始于2010年1月13日上午10:44:51。
1> u准备清洁:
1> 正在删除文件“Debugmfc app.lastbuildstate”。
1> 初始化BuildStatus:
1> 正在创建“Debugmfc app.unsuccessfulbuild”,因为指定了“AlwaysCreate”。
1> CLC编译:
1> stdafx.cpp文件
1> 时间(C:程序文件(x86)Microsoft Visual Studio 10.0vcbinc1x.dll)=6.914s
1> 时间(C:程序文件(x86)Microsoft Visual Studio 10.0VCbinc2.dll)=0.064s
……
1> 正在生成代码…
1> 时间(C:程序文件(x86)Microsoft Visual Studio 10.0VCbinc2.dll)=0.011s
……
1> 时间(C:程序文件(x86)Microsoft Visual Studio 10.0VCbinc2.dll)=0.005s
1> 舱单:
1> 正在删除文件“Debugmfc app.exe.embed.manifest”。
1> LinkedManifest公司:
1> mfc-app.vcxproj->C:Usersuserdocumentsvisual studio 2010Projectsmfc-appDebugmfc-app.exe
1> FinalizeBuild状态:
1> 正在删除文件“Debugmfc app.unsuccessfulbuild”。
1> 触摸“Debugmfc app.lastbuildstate”。
1>
1> 生成成功。
1>
1> 时间经过00:00:10.92
==========全部重建:1成功,0失败,0跳过==========
使用链接器开关“/时间”
直接在命令行中将“/time”添加到链接器选项中,或者转到“项目属性”,然后在“配置属性”->“链接器”->“命令行”中将“/time”添加到其他选项中。突出显示的文本将告诉您链接器的每个过程花费了多少时间。有关链接器为何执行多次传递的更多信息 在这里
关于LTCG的说明: 链路时间代码生成 或 LTCG公司 是链接器调用后端(c2.dll)来生成代码的地方。因此,如果您使用generate-LTCG builds,您可能会看到链接器中花费了大量的时间,尽管所有的工作都是由后端编译器完成的。
1> –全部重新生成已启动:项目:mfc应用程序,配置:调试Win32–
1> 建造开始于2010年1月13日上午10:47:39。
1> u准备清洁:
1> 正在删除文件“Debugmfc app.lastbuildstate”。
1> 初始化BuildStatus:
1> 正在创建“Debugmfc app.unsuccessfulbuild”,因为指定了“AlwaysCreate”。
1> CLC编译:
….
1> 正在生成代码…
1> 链接:
1> 通过1:间隔#1,时间=0.187s
1> 等待PDB关闭:总时间=0.484s
1> 通过2:间隔2,时间=0.578s
1> 最终:总时间=0.765s
1> 舱单:
1> 正在删除文件“Debugmfc app.exe.embed.manifest”。
1> LinkedManifest公司:
1> IncrPass2:间隔#1,时间=0.062s
1> IncrPass2:间隔#2,时间=0.032s
1> 最终:总时间=0.094s
1> mfc-app.vcxproj->C:Usersuserdocumentsvisual studio 2010Projectsmfc-appDebugmfc-app.exe
1> FinalizeBuild状态:
1> 正在删除文件“Debugmfc app.unsuccessfulbuild”。
1> 触摸“Debugmfc app.lastbuildstate”。
1>
1> 生成成功。
1>
1> 时间经过00:00:10.82
==========全部重建:1成功,0失败,0跳过==========
如果您有任何问题或有提示/故事想分享,请发表评论到这个博客,我们会在适当的地方回应。
维卡斯·巴蒂亚
VC++团队