漫漫开发路|Build Insights对模板代码进行性能分析,使用C++

C++中的模板编程
在C++程序中使用模板有时会导致很长的编译时间 。 C++BuildInsights可以提供一些工具 , 用来分析模板使用模式(templateusagepatterns)及其对编译时间的相关影响 。
在本文中 , 我们将演示如何使用vcperf分析工具和C++BuildInsightsSDK来理解和修复有问题的模板模式 。
我们通过一个案例研究证明了这些工具的实际使用 , 在该案例中 , Sprout开源元编程库的编译时间减少了25% 。 我们希望本文中介绍的这些方法可以帮助你放心地进行C++模板代码开发 。
如何获取和使用vcperf
在本文中的示例程序中 , 我们使用了vcperf这个工具 。 它可以采集编译过程中产生的各种有用的信息 , 并可以在WindowsPerformanceAnalyzer(WPA)中进行可视化地查看 。
最新版本的vcperf包含在VisualStudio2019中 。
1.获取和配置vcperf和WPA的步骤如下:
1)下载并安装最新版本的VisualStudio2019 。
2)下载并安装最新版本的WindowsADK , WPA工具包含在这个ADK中 。
3)从VisualStudio的MSVC安装目录下拷贝perf_msvcbuildinsights.dll到新安装的WPA目录下 。 这个文件是WPA的C++BuildInsights扩展 , 主要用来在WPA中正确地显示C++BuildInsights事件信息 。
a.MSVC安装目录:C:ProgramFiles(x86)MicrosoftVisualStudio2019{Edition}VCToolsMSVC{Version}binHostx64x64
b.WPA安装目录:C:ProgramFiles(x86)WindowsKits10WindowsPerformanceToolkit4)在WPA目录下打开perfcore.ini文件并添加一个对应perf_msvcbuildinsights.dll的条目 。 这样WPA就会在其启动的时候加载C++BuildInsights扩展 。
2.采集工程编译信息的步骤如下:
1)以管理员权限打开x64NativeToolsCommandPromptforVS2019 。
2)采集工程编译信息
1.执行命令:vcperf/start/level3MySessionName 。 [/level3]选项表示启用模板事件采集 。
2.编译你的C++工程 , 可以直接在VisualStudio中编译(因为vcperf将在整个系统范围仅限信息采集) 。
3.执行命令:vcperf/stop/templatesMySessionNameoutputFile.etl 。 这条命令将会停止信息采集 , 同时会分析所有事件信息 , 包括模板事件 , 然后保存所有的分析结果到outputFile.etl这个文件中 。
在WPA中查看模板信息
在工程编译过程中 , 与模板有关的最耗时的活动是模板的实例化 。 C++BuildInsights提供了一个名为[模板实例化]的WPA视图 , 通过这个视图 , 我们可以查看程序中耗时最长的模板实例化时间 。
在WPA中打开跟踪后 , 可以通过将其从[图形资源管理器]窗格拖到[分析]窗口中来打开该视图 , 如下图所示:
关于vcperf跟踪和WPA中模板事件的说明
如果在[图形资源管理器]窗格中看不到[模板实例化]视图 , 请确保已正确完成[如何获取和使用vcperf]部分中的WPA配置步骤 , 并且在启动和停止时已将正确的参数传递给vcperf 。
考虑到扩展性 , vcperf只会在分析结果文件中记录最耗时的模板实例化活动 。 如果模板实例化不是编译时间的重要因素 , 则vcperf将忽略模板信息 , 并且不会出现[模板实例化]视图 。
案例研究:加快模板元编程库Sprout的编译时间
在本案例研究中 , 我们以一个真实开源项目为例 , 展示如何使用vcperf和WPA在模板元编程代码中诊断和处理较长的编译时间 。 具体来说 , 我们演示了如何使用这些工具将Sprout库的编译时间减少了约25% 。
以下是具体的操作步骤:
1.克隆Sprout工程到本机 。
2.Checkout代码版本:6b5addba9face0a 。
3.获取一份Sprout完整编译的信息:
1)以管理员权限打开x64NativeToolsCommandPromptforVS2019 。
2)执行命令:vcperf/start/level3Sprout 。
3)执行编译命令:cl/std:c++latest/D_HAS_DEPRECATED_IS_LITERAL_TYPE=1/D_SILENCE_CXX17_IS_LITERAL_TYPE_DEPRECATION_WARNING/EHsc/I./constexpr:steps100000000.testsprsprout.cpp4)执行命令:vcperf/stop/templatesSproutsprout.etl 。 这条命令将会将采集到的编译信息保存到信息跟踪文件 。


推荐阅读