以下博文由来自水星蒸汽娱乐公司的客座作家卡洛斯·弗拉瓜斯撰写。他描述了他如何使用 C++构建洞察力SDK 在中添加新的/timetrace选项 vcperf公司 ,以及他如何使用它来构建定制工具,以满足团队的需求。你可以使用handle在Twitter上跟踪Carlos @变形虫 .
你好!我是卡洛斯·弗拉瓜斯,我在水星蒸汽娱乐公司做游戏程序员。让我们看看 C++构建洞察力SDK 帮助我创建了一些工具来减少构建时间,以及如何将一个新的可视化选项添加到 vcperf公司 .
背景
程序员最不喜欢的一件事是:等待项目编译。嗯,是的,我们都笑过这个XKCD漫画:
但看着进度条上升真的很让人沮丧!长的构建时间阻碍了项目特性和体系结构的迭代(即重构代价高昂),因此我们可以认为保持迭代周期短是团队的关键。
不久前,我开始担心构建时间太慢,并试图找到一些工具来帮助我发现构建过程中的瓶颈。直到C++构建洞察力SDK和 vcperf公司 被释放,我可以开始作出真正的和知情的进展,以加快他们!
不过,有一个问题:当我开始调查时,我对MSVC的熟悉程度不如我的引擎程序员队友。那就是 vcperf公司 真正闪亮:通过给我一个视觉形象的建设!然后我就可以理解编译器和链接器正在做的工作量,以及它的结构。
然而,现在SDK可用了,我想自己尝试一下,并创建一些定制的报告,为我们的团队和项目量身定做。设置和获取有用的信息非常容易。是的,就像凯文在他的帖子里解释的那样 查找生成瓶颈 或 分析元程序 !
在这些报告中 灵感来自阿拉斯·普兰克维č国际单位 ,我为自己添加了一个可选的可视化输出 vcperf公司 .
/时间跟踪
新的/timetrace选项允许您构建一个火焰图,可以在任何基于Chromium的浏览器中查看,比如新的microsoftedge。以下是它的一些关键特性:
- 易于可视化的执行层次结构:相关的活动紧密地放在一起。
- 查看编译器的前端和后端发生了什么:包含了哪些文件,或者代码生成有多慢。
- 概述昂贵的函数和模板实例化:如果它在图上,它可能是一个问题!
火焰图显示 vcperf公司 的内部版本:
放大中的一个文件 vcperf公司 的内部版本:
放大 vcperf公司 的生成显示模板实例化:
要自己生成这些图,请执行以下步骤:
- 克隆 来自GitHub的vcperf .
- 获取您的版本的跟踪:
- 打开提升的命令行提示符。
- 运行以下命令:
vcperf /start SessionName
- 从任何地方构建您的C++项目,甚至从VisualStudio中构建 vcperf公司 收集系统范围内的事件)。
- 运行以下命令:
vcperf /stop SessionName /timetrace outputFile.json
. 此命令将停止跟踪,分析所有事件并将火焰图保存在 outputFile.json文件 跟踪文件。
- 通过导航到打开刚刚收集的跟踪edge://tracing in 微软边缘和开始探索!
这是什么 /时间跟踪 在引擎盖下:
- 加载跟踪。
- 订阅SDK的OnStartActivity和OnStopActivity以使用父子关系构建层次结构。
- 应用过滤器仅保留相关数据(即编译速度非常快的函数可能不感兴趣)。
- 计算新的进程和线程ID以保持层次结构在一起(而不是使用原始ID)。
- 以预期格式输出图形。
SDK是如何帮助我们的
使用C++构建见解SDK对于可视化构建过程并不有用。我们已经成功地创建了一些小工具来继续分析未来的构建。以下是SDK帮助我们的一些具体案例:
- 我们发现编译器定义了一个特定的默认构造函数,它占用了我们总构建时间的3%。该文件被包含了数百次,因此每次包含都会定义一次构造函数。最后我们自己实现了 cpp公司 把那个数字减到一!
- 我们在头文件中检测到不必要的#include子句。这些文件又包含了大量的头文件,这使得前端处理这些文件的速度很慢。我们能够将它们转换成正向声明和减少耦合!
- 我们使用 .dgml文件 格式。同样,可视化数据真的很有帮助!
- 我们通过统一项目中所有文件(除了PCH!)的编译器选项,减少了项目中编译批的数量,有效地提高编译并行性。特别是,我们有两个文件 对象 同名文件。我们通过将ObjectFileName修改为$(IntDir)\%%(RelativeDir)来修复它。但是,这会创建与文件夹一样多的编译批(文件夹通常有少量文件,并产生空闲内核,等待下一批启动)。我们通过重命名其中一个文件并恢复原始ObjectFileName来解决这个问题,使其恢复为一个批处理!
- 有人警告我们在构建过程中编译的一些第三方库中缺少/MP标志。
- 我们发现模板类的生成成本很高,我们可以重构。
如您所见,SDK提供的信息在几个方面对我们有所帮助!
最后一句话
在我们结束之前,我想感谢幕后的团队 C++构建洞察力SDK 和 vcperf公司 对于这些工具,尤其是Kevin Cadieux,他花费了大量的时间和精力在review/timetrace上。
我希望这个新特性能帮助您在调查构建时间时做出更明智的决策,并使您能够创建自己的工具。请随意克隆 vcperf回购 ,探索/timetrace并根据您的需要调整它!
感谢阅读!
卡洛斯。