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可以在优化我们的工程构建上下这么大的功夫,但是呢,我的工程它也不大,也就百十来万行(手动狗头),所以,这套东西,还是留给有需要的人士吧。

命令行编译_新鲜货:C++ Build Insights告诉你为啥你的代码编译这么慢相关推荐

  1. java 命令行 配置文件_命令行玩JAVA : 完善ANT的配置文件

    3.1 编写功能完善的配置文件 进一步用好ANT,现在开始学习ANT的配置文件build.xml的详细用法,. 3.1.1 创建工程目录 命令行效果如下: song@ubuntu:~$ cd proj ...

  2. nodejs命令行执行程序_在NodeJS中编写命令行应用程序

    nodejs命令行执行程序 by Peter Benjamin 彼得·本杰明(Peter Benjamin) 在NodeJS中编写命令行应用程序 (Writing Command-Line Appli ...

  3. python 命令行 模块_深入浅析Python 命令行模块 Click

    Click 是用 Python 写的一个第三方模块,用于快速创建命令行.我们知道,Python 内置了一个 Argparse 的标准库用于创建命令行,但使用起来有些繁琐,Click 相比于 Argpa ...

  4. 图形界限命令在命令行输入_设置图形界限的命令为在命令行输入

    [填空题]CAD 的工作界面主要包括标题栏.下拉菜单. . . .状态栏以及属性栏. [判断题]当图形界限检查功能设置为 ON 时,若输入或拾取的点坐标超出绘图界限,则操作将无法进行. [单选题]患儿 ...

  5. 蓝牙键盘连接linux,命令行 蓝牙_蓝牙键盘接入UOS系统的方法

    点击上方蓝色字关注我们~ 一直没有腾出时间写这篇分享,上个月收到了UOS系统的个人授权码,本想着体验一下这款由deepin深度系统打底的新系统,但又不想折腾现在在使用的Windows系统台式机,于是找 ...

  6. java 编写命令行工具_编写命令行工具

    1.使用common-cli编写命令行工具 commons-cli是Apache开源组织提供的用于解析命令行参数的包. 先引用common-cli依赖包: commons-cli commons-cl ...

  7. go编写命令行工具_编写者的命令行文档转换工具

    go编写命令行工具 今天,我们有足够的工具可用于在我们的计算机上编辑备忘录,信件,论文,书籍,演示幻灯片和其他文档. 这既有好处也有缺点:一方面,如果您不喜欢某个软件,则可以随时随地转到另一个软件上: ...

  8. java 命令行 解析_如何在Java中解析命令行参数?

    小编典典 例如,这是你commons-cli用来解析2个字符串参数的方法: import org.apache.commons.cli.*; public class Main { public st ...

  9. python编写命令行框架_使用 Python 和 Click 编写命令行应用程序

    简评:python 构建命令行应用的第三方比较有名的包除了 click 之外还有一个叫 docopt,这是一个以文档先行为目标的包.个人是比较倾向于 Click 的,看了这篇文章之后,也很快写了一个 ...

最新文章

  1. 整理了 70 个 Python 面向对象编程案例,怎能不收藏?
  2. JSOUP 打开url的方式
  3. 【Python】学习Python的三个神级网站
  4. C语言 linux环境基于socket的简易即时通信程序
  5. 【原创】大公司为什么还在采用过时的技术
  6. Java初学者必知 关于Java字符串问题
  7. CoolFormat 源代码格式化工具使用手册
  8. 读书笔记 - js高级程序设计 - 第四章 变量 作用域 和 内存问题
  9. 如何在Linux上使用HAProxy配置HTTP负载均衡系统
  10. c语言读写txt坐标文件数据,C语言——从txt文件中读写数据
  11. 《数学建模算法与应用》第2版 司守奎 孙兆亮及其习题解答两本书的配套程序及数据
  12. MSOCache office问题
  13. C# Devexpress控件详细安装攻略
  14. 良好的研发团队文化是怎样「长」成的?一句成功的十四字真言!
  15. UBR/CBR/VBR
  16. AGS量化自动炒币机器人与同类软件对比
  17. 淘宝u站是什么?淘宝u站是干啥的?
  18. 软考信息系统监理师:2016年4月1日(冬青子)作业
  19. 干货 | 携程持久化KV存储实践
  20. ubuntu内核版本降级与切换

热门文章

  1. 调试异常 Free Heap block xxxxxxxx modified at xxxxxxxx after it was freed
  2. TDI Filter 过滤驱动
  3. 数据结构 -- 二叉树
  4. Java中的DeskTop类
  5. UNIX中的文件和目录
  6. android的横竖屏切换,Android横竖屏切换 初步探究
  7. java服务端开发 php_PHP使用thrift做服务端开发
  8. 记一次lua打包环境导致的coredump
  9. 查看OpenStack版本
  10. oracle断开不活跃链接,活跃进程连接导致数据库迟迟未关闭