宣布BuildInfer for C ++

在构建系统之间进行分析,可视化和迁移

您的C ++编译速度缓慢还是难以理解? 我们目前正在寻找更多案例研究。 如果您有兴趣改进基于Linux的构建(商业或开源),请联系
https://buildinfer.loopperfect.com/
宣布BuildInfer for C ++

由于所使用的构建系统多种多样,C ++社区支离破碎。 这种碎片化使得很难:

  • 了解第三方库的工作方式
  • 将两个库集成在一起
  • 跨库优化(例如,LTO)
  • C ++源代码的构建工具(标头在哪里?)
  • 实施人工制品缓存
  • 确定构建过程中哪些步骤使您减速

对于C ++社区,这意味着:

  • 浪费时间将项目粘合在一起
  • 浪费时间等待缓慢的构建
  • 浪费时间重写已经存在但难以集成的代码

如果能够提取任何C ++项目的可读构建说明,而不管所使用的构建系统如何,那不是很好吗?

宣布BuildInfer

通过在系统级别记录构建过程,我们可以推断有关项目结构的高级信息。 由于BuildInfer记录的级别很低,因此我们的技术适用于任何C ++构建系统。

一旦有了高级构建说明,我们就可以可视化,转换甚至将复杂的构建系统移植到更强大的构建系统,例如Buck和Bazel。

初步发现

我们已经成功将以下项目移植到Buck上

此外,我们发现这些项目均未附带可复制的构建系统! 通过将它们移植到Buck,我们可以保证这一点。

可复制的构建对于安全性,缓存性能和调试至关重要。 有关更多信息,请参见:

马普尼克

Mapnik是使用C ++编写的用于基于桌面和服务器的地图渲染的开源地图绘制工具包。
  • 将Mapnik从SCons移植到Buck可以将构建时间从30分钟减少到6分钟
  • 我们估计启用预编译头将使构建时间进一步缩短10%。
  • Mapnik不使用版本脚本,并且需要-fvisibility=inline和共享版本以防止符号冲突。 使用BuildInfer的输出,我们确定了核心问题是此头文件中的非静态定义。
  • 我们生成了一个图表,显示了各个文件组和可执行文件的交互:
宣布BuildInfer for C ++
在GitHub上查看完整的SVG图像

该图告诉我们以下内容:

  • Mapnik不使用版本脚本
  • 一些目标文件的扩展名为*.os
  • scons/scons.py生成几个翻译单元

LLVM和C

LLVM编译器基础结构项目是“模块化和可重复使用的编译器和工具链技术的集合”,用于开发编译器前端和后端。
  • 默认情况下,LLVM强制实施“超级项目”结构,该结构迫使您以特定方式对项目进行布局。 使用BuildInfer,可以将LLVM重构为许多小模块。
  • 相似的直线构建时间,但大大改进了增量构建。
  • 我们可以缓存LLVM Tablegen工件-使用CCache无法实现。
  • 我们估计使用预编译的头文件可以将直线构建时间提高20%。 使用BuildInfer提取的信息可以轻松实现这一点。

我们还对依赖关系图的上下文中的构建时间进行了简单分析。 这些表通过汇总构建每个文件及其所有受抚养人所花费的时间,显示了在LLVM中更改各种文件的估计成本。

这些文件是增量构建的“热点”,并且可能是重构的理想选择。

请注意,这些数字是基于单线程构建的。 真正的构建将需要这些时间的比例因子。

llvm-config.h特别有趣。 它定义了整个项目中引用的一些常量:

因此,每次更改版本字符串或默认目标时,LLVM都会生成15264 15,264 second构建(比例因子)! 这些值可能会重构为翻译单位:

我们还生成了一个图表,显示了各个文件组和可执行文件之间的交互:

宣布BuildInfer for C ++
在GitHub上查看完整的SVG图像

该图向我们显示:

  • 版本脚本是通过Bash生成的,称为*.export
  • tblgen使用*.td文件生成*.inc头文件。
  • Clang和LLVM都有自己的tblgen (它们有何不同?)
  • 许多文件是由CMake直接生成的。

OpenCV的

OpenCV是主要针对实时计算机视觉的编程功能库。
  • 实际上,OpenCV可分为多个独立模块。
  • BuildInfer确定这些模块之一依赖于另一个模块的实现细节,因此我们提交了一个补丁
  • 使用Buck可以通过在完整构建完成后禁用预编译头来改善OpenCV的增量构建时间。

我们还生成了一个图表,显示了各个文件组和可执行文件之间的交互:

宣布BuildInfer for C ++
在GitHub上查看完整的SVG图像
  • *.cl文件由cl2cpp.cmake以生成*.cpp文件
  • 一个pkg-configOpenCVGenPkgconfig.cmake生成
  • 使用预编译的标头*.gch并且不生成标头入口点。
  • OpenCV的构建系统使用Prolog!

感兴趣吗?

您的C ++编译速度缓慢还是难以理解? 我们目前正在寻找更多案例研究。 如果您有兴趣改进基于Linux的构建(商业或开源),请联系

您也可能对。。。有兴趣…

From: https://hackernoon.com/announcing-buildinfer-for-c-3dfa3eb15feb