C++代码一直以其运行时的高性能高调面对世人, 可是提及编译速度,却只有低调的份了。好比我如今工做的源代码,哪怕使用Incredibuild调动近百台机子,一个完整的build也须要四个小时,恐怖!!!虽然平时开发通常不须要在本地作完整的build,但编译几个相关的工程就够你等上好一段时间的了(老外管这个叫monkey around,至关形象)。想一想若干年在一台单核2.8GHZ上工做时的场景 - 面前放本书,一点build按钮,就低头读一会书~~~往事不堪回首。html
能够想象,若是不加以重视,编译速度极有可能会成为开发过程当中的一个瓶颈。那么,为何C++它就编译的这么慢呢?apache
我想最重要的一个缘由应该是C++基本的"头文件-源文件"的编译模型:网络
这里,问题在于无数头文件的重复load与解析,以及密集的磁盘操做。框架
下面从各个角度给出一些加快编译速度的作法,主要仍是针对上面提出的这个关键问题。分布式
1、代码角度模块化
以头文件为例,不要把两个不相关的类,或者没什么联系的宏定义放到一个头文件里。内容要尽可能单一,从而不会使包含他们的文件包含了不须要的内容。记得咱们曾经作过这么一个事,把代码中最"hot"的那些头文件找出来,而后分红多个独立的小文件,效果至关可观。svn
其实咱们去年作过的refactoring,把众多DLL分离成UI与Core两个部分,也是有着相同的效果的 - 提升开发效率。函数
2、综合技巧 性能
3、编译资源 ui
要提升速度,要么减小任务,要么加派人手,前面两个方面讲得都是减小任务,而事实上,在提升编译速度这块,加派人手仍是有着很是重要的做用的。
假设你有solution A和solution B,B依赖于A,因此必须在A以后Build B。其中A,B Build各须要1个小时,那么总共要2个小时。但是B必定要在A以后build吗?跳出这个思惟框架,你就有了下述方案:
- 同时开始build A和B 。
- A的build成功,这里虽然B的build失败了,但都只是失败在最后的link上。
- 从新link B中的project。
这样,经过让A的build与B的编译并行,最后link一下B中的project,整个编译速度应该可以控制在1个小时15分钟以内。
另外,这本书谈了不少这方面的内容:大规模C++程序设计。