漫漫开发路PCH:提升大型工程编译速度的利器( 三 )


评估最终结果
在创建了PCH之后 , 我们收集了Irrlicht完整重新编译的信息 。 我们注意到 , 总体编译时间由57秒下降到了35秒 , 也即有了近40%的提升 。 同时 , 我们还发现 , 之前提到的Windows.h和irrAllocator.h这两个头文件已经不再显示在头文件扫描列表的顶部了 。 如下图所示:
漫漫开发路PCH:提升大型工程编译速度的利器
文章图片
从C++BuildInsightsSDK中获取有关PCH的建议
在vcperf和WPA中执行的大部分分析任务都可以使用C++BuildInsightsSDK以程序化的方式进行 。 我们准备了一个示例工程TopHeaders , 它会显示最多被扫描的头文件和它们各自占前端编译总时间的占比 。 它还显示出每个头文件被包含到编译单元中的次数 。
这次 , 让我们再次回顾之前的研究案例 , 不过这次 , 我们是使用TopHeaders这个示例工程 。 具体步骤如下:
1.克隆C++BuildInsightsSDKSamples仓库 。
2.编译Samples.sln解决方案 , 编译目标平台为x86或者x64 , 使用debug或者release配置 。 示例工程生成的二进制文件将会位于out/{architecture}/{configuration}/TopHeaders目录 。
3.根据之前的案例研究中的步骤对收集工程编译的信息 。 使用vcperf/stopnoanalyzeIrrlichtirrlicht-raw.etl , 而不是/stop来停止信息收集 。 这个操作将会生成一个能被SDK处理的原始编译信息文件 。
4.将irrlicht-raw.etl作为第一个参数传递给TopHeaders可执行文件 。
如下图所示 , TopHeaders将会正确的显示出Windows.h和irrAllocator.h这两个文件占用了最长的扫描时间 。 同时 , 我们还看到它们分别被包含了45次和217次 , 这和我们之前在WPA中看到的结果是一致的 。
漫漫开发路PCH:提升大型工程编译速度的利器
文章图片
如果将我们修改过的(添加了PCH)工程提交给TopHeaders , 则会显示出Windows.h和irrAllocator.h这两个头文件不再是主要的瓶颈问题 。 同时 , 我们也观察到有一些其他的头文件也在列表中消失了 。 这些头文件之前被irrAllocator.h所引用 , 进而被预编译到了PCH中 。
漫漫开发路PCH:提升大型工程编译速度的利器
文章图片
理解示例工程代码
首先 , 我们过滤掉了所有的停止活动事件 , 只保留了前端文件和前端扫描事件 。 然后 , 我们请求C++BuildInsightsSDK来为我们展开前端文件的事件堆栈 。 这可以通过调用MatchEventStackInMemberFunction来实现 , 它会从事件堆栈中抓取匹配TopHeaders::OnStopFile签名的事件 。 当我们得到一个前端扫描事件时 , 我们就可以简单直接地追踪到总体的扫描时间了 。
漫漫开发路PCH:提升大型工程编译速度的利器
文章图片
我们使用到了OnStopFile这个函数来汇总每个头文件的扫描时间到[std::unordered_mapfileInfo_]结构体 。 同时 , 我们还会追踪每个包含头文件的编译单元的次数 , 包括被包含头文件的路径信息 。
漫漫开发路PCH:提升大型工程编译速度的利器
文章图片
在分析的最后 , 我们打印出我们手机的有关头文件的信息 , 包括那些占用最多扫描时间的头文件列表 。
漫漫开发路PCH:提升大型工程编译速度的利器
文章图片
总结
随着工程规模的增加 , 编译时间越来越成为开发者一个头痛的问题 。
善用PCH , 有助于降低编译的时间 , 让你觉得生命中还是有那么一些美好的东西的 。
漫漫开发路PCH:提升大型工程编译速度的利器
文章图片


推荐阅读