如何加速C++文件的编译速度?
一、为什么慢?
重要的一个原因是C++的基本 头文件-源文件的编译模型:
- 每个源文件为一个编译单元
- 头文件数量多,可能会包含上百甚至上千个头文件
- 存在重复解析,每个编译单元中,这些头文件都要从硬盘里读取然后被解析
- 每个编译单元都会产生一个obj文件
- 这些obj文件被link到一起,此过程很难做到并行
二、如果加快编译?
1. 代码角度
1.1 使用前置声明
不要直接包含头文件,推荐使用前置声明。
前置声明只是在代码中引入了类Foo,是一个不完全类型——因为我们不知道它具体包含了哪些成员。
不完全类型只能在非常有限的情况下使用:
- 只能定义指向这种不完全类型的指针和引用(因为不知道多大?)
- 只能声明(但不可以定义)以不完全类型作为参数或者返回类型的函数(也是因为不知道多大?)
原因:
- 任何一个多余的头文件,都可能会被无限放大。
- 虽然很多时候前置声明某个namespace中的类比较痛苦,但你仍值得这么做
- 类的成员、函数参数等尽量使用引用、指针,为前置声明创造条件
坏处:
- 隐藏了依赖关系,头文件改动时,用户代码会跳过必要的重编过程
- 前置声明可能会被库的后续更改破坏
- 前置声明来自命名空间std::的symbol时,其行为是未定义的
使用原则:
- 尽量避免前置声明那些定义在其他项目中的实体
- 函数:总是使用#include
- 类模板:优先使用#include
1.2 使用Pimpl模式
全称 Private Implemention。
原因:
- 传统的C++类接口与实现是放在一起的;Pimpl可实现二者完全分离
- 只要公共接口不变,对类实现的修改,始终只需要编译此CPP,不涉及头文件的重编
- 此外,对外界提供的头文件内容也会精简很多
1.3 高度模块化
尽量低耦合,尽可能减少相互依赖。
原因:
- 文件与文件之间,一个文件的变化,尽量不要引起其他文件的重编
- 工程与工程之间,一个工程的修改,尽量不要引起其他工程的编译
- 要求头文件内容尽量单一,保证内聚性
- 优化思路:可以把代码中最hot的头文件找出来,拆分成高内聚的独立小文件
1.4 删除冗余的头文件
项目大了,又涉及团队协作,很有必要通过自动化脚本识别和删除冗余的头文件包含
1.5 注意inline和template
这两种机制都会强制我们在头文件中包含实现,会增加头文件的内容。在使用这两个新特性之前,需要仔细权衡一下。
2. 综合技巧
2.1 预编头文件(PCH)
**把一些常用的、但不常改动的头文件放到预编译头文件中。 **
好处:在单个工程中,就不需要在每个编译单元里一遍又一遍的load与解析
2. 2 Unity Build
考虑将所有的CPP包含在一个CPP中(如all.cpp),然后只编译all.cpp
好处:只存在一个编译单元,不会重复的load与解析,同时只产生一个obj,链接时也不需要密集的磁盘操作。
2.3 ccache
全称 compiler cache,借助上一次编译的结果,使rebuild在保持结果相同的情况下,极大地提高速度。
好处:ccache是根据文件内容为判断原则,而非更新时间(git clone时不可靠)
2.4 避免过多的Additional Include Directories
编译器在定位include的头文件时,是根据你提供的include directories进行搜索。如果提供的目录过多,则在搜索定位时耗费的时间就会增加。
3. 编译资源
3.1 并行编译
通过 make -j4开启4线程并行编译。
3.2 升级磁盘
编译速度比较依赖磁盘的读写性能,在多线程并行编译时,磁盘性能可能存在瓶颈,可以升级更高转数、或者SSD、或者RAID0
3.3 分布式编译
利用多态机器同时编译,通常在比较大的工程上使用
如何加速C++文件的编译速度?的更多相关文章
- 加速 Android Studio 的编译速度 2.2
Android studio 2.2 当中有一项新的功能:Dex In Process. 这项功能可以动态的加快编译速度,以及提高Instant Run 的效率. 那么怎么来使用这项新功能呢?你只需要 ...
- 在VisualGDB中配置预编译头加快编译速度
今天是中秋佳节,但是写完已经是第二天凌晨了,还是祝大家中秋快乐! VS对C++的支持相较GCC太弱了,连续几个VS版本对C++的改进都很小.很少.对Cpper也许是一种痛,我们也许希望能使用VS的强大 ...
- 通过预编译头文件来提高C++ Builder的编译速度
C++ Builder是最快的C++编译器之一,从编译速度来说也可以说是最快的win32C++编译器了.除了速度之外,C++builder的性能也在其它C++编译器的之上,但许多Delphi程序员仍受 ...
- 提高编译速度! 第一次运行需要注释掉,不然会报错,因为需要编译SO库文件 !
// 提高编译速度! 第一次运行需要注释掉,不然会报错,因为需要编译SO库文件 ! tasks.whenTaskAdded { task -> if (task.name.contains(&q ...
- ccache - 让Xcode编译速度飞起来
今天来介绍一个小工具ccache,其可以提高xcode的编译速度.说起缘由,是因为我的苹果电脑配置比较低,而每次开发调试或测试打包都需要编译工程,虽然项目工程代码量不算大,但是编译的时间还是很长,尤其 ...
- iOS进阶--将项目的编译速度提高5倍
前言 作为开发团队的负责人,最近因为在快速迭代开发新功能,项目规模急速增长,单个端业务代码约23万行,私有库约6万行,第三方库代码约15万行,单个客户端的代码行数约60万.现在打包一次耗时需要11~1 ...
- webpack4提升180%编译速度
前言 对于现在的前端项目而言,编译发布几乎是必需操作,有的编译只需要几秒钟,快如闪电,有的却需要10分钟,甚至更多,慢如蜗牛.特别是线上热修复时,分秒必争,响应速度直接影响了用户体验,用户不会有耐心等 ...
- 6个技巧加速你的gradle编译
近期我们都在讨论build系统,我们看了一些技巧能够让你的Maven build更快. 结论和反映都势不可挡.由于我们提供的技巧,很多其它的人都非常高兴能加快他们完毕自己的项目.如今,让我们看一下怎么 ...
- vs2013提高编译速度
最近做新的项目,很多库是之前项目积累下来的库.在windows下使用的IDE是vs2013,整体编译的时候,明显感觉编译速度较慢,文件是一个一个编的. 从编译器本身的角度,vs2013是提供了加快编译 ...
- 提高Delphi的编译速度(bpl和bcp)
delphi的编译速度提高(一) 此博文为原创,转载请注明出处 作者 :二娃 此博文的内容我曾经回答群内和论坛内的网友提问时回答过,现在写第一部分,第二部分,我再给出一个终极的提高速度的方法 我用过d ...
随机推荐
- python打包Windows.exe程序(pyinstaller)
python打包Windows.exe程序(pyinstaller) 基础命令 pip install pyinstaller 使用pip命令来安装pyinstaller模块. -F: pyinsta ...
- 实现一个简单的echarts词云图PythonFlask
cloud.html 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta char ...
- 学习Source Generators之从swagger中生成类
前面学习了一些Source Generators的基础只是,接下来就来实践一下,用这个来生成我们所需要的代码. 本文将通过读取swagger.json的内容,解析并生成对应的请求响应类的代码. 创建项 ...
- #点分树#洛谷 6626 [省选联考 2020 B 卷] 消息传递
题目 多组数据多组询问,对于一个点 \(x\) 和 树上的距离 \(k\),问 \(\sum_{i=1}^n[Dis(x,i)==k]\) 分析 卡了一页的常,发现两个 \(\log\) 过不去,有一 ...
- Android NDK之使用 arm-v7a 汇编实现两数之和
Android NDK之使用 arm-v7a 汇编实现两数之和 关键词: NDK armv7a WebRTC arm汇编 CMake 最近适配对讲程序,在webrtc的库编译的过程中,发现其为arm的 ...
- hive窗口分析函数使用详解系列一
1.综述 Hive的聚合函数衍生的窗口函数在我们进行数据处理和数据分析过程中起到了很大的作用 在Hive中,窗口函数允许你在结果集的行上进行计算,这些计算不会影响你查询的结果集的行数. Hive提供的 ...
- 帕鲁重大更新!macOS 竟然也能玩了
近日,<幻兽帕鲁>迎来了 v0.2.1.0 大版本的更新. 本次更新的最大亮点是新实装的突袭头目系统.玩家可以在 "召唤祭坛" 献祭石板,从而召唤强大的突袭头目.其中, ...
- 【FAQ】视频编辑服务常见问题及解答
Q1问题描述 1. 访问贴纸等素材的时候提示"网络异常,请重试"怎么办? 2. 使用AI能力时,提示"errorCode:20124 errorMsg:Method no ...
- Qt:Qt自适应高分辨率屏幕
现在的电脑分辨率越来越高,DPI也越来越大,使用Qt创建出来的界面,在小分辨率电脑上显示的很好,但是在大分辨率电脑上显示异常,感觉边框被压缩了,看起来很不协调. 从Qt 5.6 还是从Qt 5.14 ...
- 报名开启 | HarmonyOS第一课“营”在暑期系列直播
<HarmonyOS第一课>2023年再次启航! 特邀HarmonyOS布道师云集华为开发者联盟直播间 聚焦HarmonyOS 4版本新特性 邀您一同学习赢好礼! 你准备好了吗? ↓↓↓预 ...