新鲜货:C++ Build Insights告诉你为啥你的代码编译这么慢

新鲜货:C++ Build Insights告诉你为啥你的代码编译这么慢

作者:BlogUpdater |  时间:2019-11-08 |  浏览:291 |  评论已关闭 条评论

C++项目的编译应该越来越快才对
在Visual Studio 2019 16.2中,我们通过提升链接器性能来缩短工程的总体编译时间。今天,我们很高兴的引入一系列可以进一步提升编译速度的新玩意儿,我们就先叫它C++ Build Insights吧。
你是否在一边吃早餐一边编译代码的时候想过:编译器现在这会儿正在那鼓捣什么呢?
在C++ Build Insights中,我们可以帮助你解答上面的问题。通过整合新的工具和Event Tracing for Windows(ETW),我们可以得到有关C++编译工具链工作时的一些可视化信息。通过查看这些信息,我们可以知道到底是哪些工作项目拖慢了工程的整体构建速度,并从中对症下药进行改进。

让我们开始吧
当然了,你首先需要安装Visual Studio 2019 v16.4 Preview 3。然后按照如下的几个步骤开始收集构建时间信息。
> 以管理员启动VS2019 Preview中的x64命令行程序。
> 执行: vcperf /start MySessionName。
> 编译的工程。
> 执行:vcperf /stop MySessionName myTrace.etl。

在vcperf命令中,我们开始了一个监测会话,会话名称被指定为MySessionName。然后当执行vcperf /stop时,所有有关构建过程的性能检测信息都将会写入到myTrace.etl中。

借助ETW工具,C++ Build Insights可以收集到系统上所有正在运行的编译器和链接器。你并不需要在执行vcperf时以命令行的方式编译你的工程,你还是可以使用其他命令启动编译,甚至你直接可以使用Visual Studio进行编译。不管使用哪种方式触发编译,都可以收集到对应的信息。

使用ETW获取构建信息的另一个好处在于,你不需要在编译或者链接过程中添加额外的命令行参数,因为ETW内建在操作系统中并默认启用。所以,C++ Build Insights将可以在所有的构建系统上正常工作,不需要添加任何的额外配置。

当完成信息的收集之后,你就可以在Windows Performance Analyzer(WPA)中打开Trace文件了。这个WPA是Windows Performance Toolkit的一部分。有关更多关于WPA版本的信息,可以参见C++ Build Insights的文档。

图形化呈现

在接下来的部分中,我将展示一些我们在WPA中呈现出来的一些构建时间的图形化界面。
如果想要对工程的构建过程有一个大概的了解,就必须要知道整个构建工程中发生了哪些事情。Build Explorer是C++ Build Insights中的一个核心工具,主要用来呈现构建过程中的主要工序及花费的时间。你只需要从WPA中将左边的Graph Explorer面板中拖到右边的分析视图中即可。在这个分析视图中,我们可以基于这个分析视图找到潜在的并行构建问题,构建的瓶颈,以及可以更加清楚的观察到构建的时间主要集中在哪个阶段(解析,代码生成或者链接)。

更加详尽的统计分析
潜藏最深的构建时间问题通常是那些缓慢发展而来的细小问题,它们会慢慢吞食你的构建时间,直到最后,当你发现构建的时间实在是难以接受时,才会意识到它们的存在。一个简单的例子是,相同头文件的包含在多个编译单元中。每一次头文件包含或许不会对整体的构建过程造成很大的影响,但是这个头文件和其他的编译单元一起包含的时候,问题就会出现了。C++ Build Insights可以提供详尽的统计分析来提示潜在的警告来应对此类问题。
下面是一个例子,显示出在构建过程中那些消耗时间最长的头文件包含。你可以在WPA的左侧的Graph Explorer中选择文件视图来查看这个信息。

可以得到的统计信息

总结
微软啊,你真是为我等大C++程序员操碎了心呐,我是真没想到VS可以在优化我们的工程构建上下这么大的功夫,但是呢,我的工程它也不大,也就百十来万行(手动狗头),所以,这套东西,还是留给有需要的人士吧。

标签:

评论已关闭。