宣布BuildInfer for C ++
在构建系统之间进行分析,可视化和迁移
您的C ++编译速度缓慢还是难以理解? 我们目前正在寻找更多案例研究。 如果您有兴趣改进基于Linux的构建(商业或开源),请联系 !
https://buildinfer.loopperfect.com/
由于所使用的构建系统多种多样,C ++社区支离破碎。 这种碎片化使得很难:
- 了解第三方库的工作方式
- 将两个库集成在一起
- 跨库优化(例如,LTO)
- C ++源代码的构建工具(标头在哪里?)
- 实施人工制品缓存
- 确定构建过程中哪些步骤使您减速
对于C ++社区,这意味着:
- 浪费时间将项目粘合在一起
- 浪费时间等待缓慢的构建
- 浪费时间重写已经存在但难以集成的代码
如果能够提取任何C ++项目的可读构建说明,而不管所使用的构建系统如何,那不是很好吗?
宣布BuildInfer
通过在系统级别记录构建过程,我们可以推断有关项目结构的高级信息。 由于BuildInfer记录的级别很低,因此我们的技术适用于任何C ++构建系统。
一旦有了高级构建说明,我们就可以可视化,转换甚至将复杂的构建系统移植到更强大的构建系统,例如Buck和Bazel。
初步发现
我们已经成功将以下项目移植到Buck上 :
此外,我们发现这些项目均未附带可复制的构建系统! 通过将它们移植到Buck,我们可以保证这一点。
可复制的构建对于安全性,缓存性能和调试至关重要。 有关更多信息,请参见:
马普尼克
Mapnik是使用C ++编写的用于基于桌面和服务器的地图渲染的开源地图绘制工具包。
- 将Mapnik从SCons移植到Buck可以将构建时间从30分钟减少到6分钟 。
- 我们估计启用预编译头将使构建时间进一步缩短10%。
- Mapnik不使用版本脚本,并且需要
-fvisibility=inline
和共享版本以防止符号冲突。 使用BuildInfer的输出,我们确定了核心问题是此头文件中的非静态定义。 - 我们生成了一个图表,显示了各个文件组和可执行文件的交互:
该图告诉我们以下内容:
- 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
构建(比例因子)! 这些值可能会重构为翻译单位:
我们还生成了一个图表,显示了各个文件组和可执行文件之间的交互:
该图向我们显示:
- 版本脚本是通过Bash生成的,称为
*.export
-
tblgen
使用*.td
文件生成*.inc
头文件。 - Clang和LLVM都有自己的
tblgen
(它们有何不同?) - 许多文件是由CMake直接生成的。
OpenCV的
OpenCV是主要针对实时计算机视觉的编程功能库。
- 实际上,OpenCV可分为多个独立模块。
- BuildInfer确定这些模块之一依赖于另一个模块的实现细节,因此我们提交了一个补丁 。
- 使用Buck可以通过在完整构建完成后禁用预编译头来改善OpenCV的增量构建时间。
我们还生成了一个图表,显示了各个文件组和可执行文件之间的交互:
-
*.cl
文件由cl2cpp.cmake
以生成*.cpp
文件 - 一个
pkg-config
由OpenCVGenPkgconfig.cmake
生成 - 使用预编译的标头
*.gch
并且不生成标头入口点。 - OpenCV的构建系统使用Prolog!
感兴趣吗?
您的C ++编译速度缓慢还是难以理解? 我们目前正在寻找更多案例研究。 如果您有兴趣改进基于Linux的构建(商业或开源),请联系 !
您也可能对。。。有兴趣…
From: https://hackernoon.com/announcing-buildinfer-for-c-3dfa3eb15feb