提高编译效率:Unity Builds

简介: 最近,我发现了一个方法来减少在C/C++项目的编译时间,就是所谓的Unity Builds(UB)。这项技术非常简单, 通过减少磁盘访问的数量而减少了编译时间。
最近,我发现了一个方法来减少在C/C++项目的编译时间,就是所谓的Unity Builds(UB)。这项技术非常简单, 通过减少磁盘访问的数量而减少了编译时间。

在编译过程中include的文件会被多次访问, 每一个编译单元(Translation Unit,指的是编译出一个object文件的过程)都会访问到。除非你用一个固态磁盘,不然一般的硬盘一定会拖慢编译过程。

在示例的项目中,有两个假的编译单元,t1.cpp和t2.cpp,都包含相同的头文件ub/b.h, 而它自己又引用了ub/a.h。为了方便验证,在MSVC中打开showIncludes (译注:在项目属性里C/C++->Advanced->Show Includes), 你将看到一个类似这样的输出(*译注,如果没有看到,试试清一下工程再编译。):

Compiling...
t2.cpp
Note: including file: b.h
Note: including file:  a.h
t1.cpp
Note: including file: b.h
Note: including file:  a.h

可以看到,每个编译单元都打开了相同的头文件。UB的目的就是减少这些费时费力的事(比如. 引用的文件), 具体的做法就是将多个translation unit由一个单一的translation unit来代替。


新增一个文件ub.cpp, 内容如下:

#include <t1.cpp>
#include <t2.cpp>


从项目里去掉t1.cpp和t2.cpp, 然后编译。 这次的输出类似如下这样:

Compiling...
ub.cpp
Note: including file: t1.cpp
Note: including file:  b.h
Note: including file:   a.h
Note: including file: t2.cpp

同样也是4个引用的文件。有没有性能提升呢? 结果是肯定的,第一次遇到b.h会同时引发对a.h的解析,可是第二次遇到b.h时就不需要再解析了。
对于一些有着很深的引用层次和大量编译单元的项目来说,Unity Builds的做法绝对会节省大量的编译时间。


/*译注,作者下面介绍了为CMake编写的自动脚本,此处略去。具体的应用还是要看各个编译器的做法。*/


性能提升
下面这个图显示出了Unity Builds对于编译时间的贡献。所用的项目都是由公司开发的一些库和单元测试项目。
      

实践要点

持续集成
相对于The Magic of Unity Builds中观点, 因为一点修改会导致整个unity unit的重新编译,所以最好不要用于平时的开发工作。倒是可以考虑在CI服务器上执行,这样可以节省大量的时间来跑自动化测试。

单元切分
在一个unity unit包含太多的文件,可能会引起内存不足的问题。即便你的内存够大,最好也不要都放在一起。


代码质量

引入Unity Builds会隐藏一些编码问题,比如重复的代码。因为是将一些translation unit放到一起,就很容易导致重复定义的问题。

原文地址: Reducing Compilation Time: Unity Builds

转载请注明出处: http://blog.csdn.net/horkychen
链接:
  * Unity Builds CMake Demo Project
  * The Evils of Unity Builds
   * 浅谈怎样加快C++代码的编译速度


目录
相关文章
|
12月前
|
JSON 编译器 API
[✔️]lua-cjson 编译,在unity中使用cjson
[✔️]lua-cjson 编译,在unity中使用cjson
162 0
|
开发工具 Android开发 图形学
Unity编译时找不到AndroidSDK的问题 | Unable to list target platforms(转载)
原文:http://www.jianshu.com/p/fe4c334ee9fe 现象 在用 Unity 编译 Android 平台的应用时,遇到 Unable to list target platforms 的问题。
1963 0
|
3天前
|
开发框架 Java C#
【Unity逆向】玩游戏遇到的“飞天锁血”是怎么实现的?
【Unity逆向】玩游戏遇到的“飞天锁血”是怎么实现的?
96 0
|
3天前
|
存储 自然语言处理 监控
【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换
Unity的多语言本地化是一个很实用的功能,它可以帮助游戏支持多种语言,让不同语言的玩家都能够更好地体验游戏。 而实现本地化的方案也有很多种,各个方案之间也各有优劣,后面也会对多个方案进行介绍学习。 本文就来介绍一个专门作用于多语言本地化的Unity官方插件:Localization 。 这个插件方便进行游戏的多语言本地化,让游戏支持多种语言,下面就来看看该插件的使用方法吧!
|
3天前
|
定位技术 C# 图形学
Unity和C#游戏编程入门:创建迷宫小球游戏示例
Unity和C#游戏编程入门:创建迷宫小球游戏示例
80 2
|
9月前
|
开发框架 Java .NET
《unity游戏优化》第8章内存优化
《unity游戏优化》第8章内存优化
|
3天前
|
运维 API C#
【Unity游戏破解】外挂原理分析
【Unity游戏破解】外挂原理分析
172 0
【Unity游戏破解】外挂原理分析