本帖最后由 liuweifeng168 于 2010-1-20 13:52 编辑
现在一些大型的工程项目,都是由成千上百的源文件组成,那编译的时候就需要花费大量的时间。以高通开发平台为例,每完全编译一次所需要花费的时间少则6、7个小时,多则15、16个小时。这篇**主要讨论不需要任何编译加速软件(如,ElectricAccelerator软件)的情况下去提高编译的时间。
(一)编译器实际执行情况的分析。编译器进行编译的时候大致分为下面三个阶段
1)
编译器进行加载原文件。这个时间一般情况下是固定的。
2)
编译器获得license。一般情况下获得floating license的时间要比node lock license的时间长。编译器只是简单的解析node lock license文件并确定次license文件可用就可以了;而对于floating license,编译器先需要通过TCP/IP网络给服务器发送一个消息,然后等待响应,当接收到响应后进行确认是否是个可用的license,最后对license进行解析并确认。为了提高编译速度还是尽量使用node lock license。
3)
编译器进行编译原文件。这步是关键的一步,可从下面几步进行优化。
l
所用时间的长短取决于源文件的复杂度和尺寸,编译少量的大文件就比编译大量的小文件花费的时间少,主要因为少量的大文件花费在加载、获得license上的时间就少的多了。
l
使用一个命令编译多个文件比更能节省编译的时间,如原先的脚本文件如下:
armcc file1.c ….
armcc file2.c ….
armcc file3.c ….
…….
如果改为如下的形式,编译的时间要少很多,但是一定要注意并不是所有的文件都可以合并为一个,因为可能每个每个文件的编译选项不同。
armcc file1.c file2.c file3.c ….
(二)包含路径的影响
包含路径对我们编译的时间影响也很大,应该尽量减少包含路径。还应该尽量避免多次包含同一个头文件,如我们在foo.h文件中这样填写。
#ifndef foo_h
#define foo_h
….
#endif
/* foo_h */
我们也可以在里添加-W+g来警告不合法的头文件。
(三)使用make进行并行编译
很多情况下,在一些大的工程中是使用makefile进行编程的,这种情况下我们可以利用多线程及多核的思想来加快编译的速度,典型的语法如下:
make
–j
N*M
其中N代表执行的进程数,M代表执行的时候所参与的处理器核数。
这种情况可以大大的加快编译的速度,比如我们现在使用一个24核处理器的服务器进行编译,那可以使用命令:
Make
–j
48
表示使用24个处理器核,每个核开启2个进程。
(四)操作系统的选择
一般情况下,在linux和solaris操作系统下比在windows系统下编译的速度更快。如果是使用windows操作系统,那么我们尽量关闭杀毒软件,来避免杀毒软件对文件的扫描浪费的时间。 |