星期二, 四月 13, 2004

减少编译时间

有两个非常有效的方法可以提高编译速度:
1) 不该编译的文件不要编译
2) 一定需要编译的文件通过分布式工具做编译

第一点看起来很简单,却非常非常有效,尤其对于大型的项目,在完全重编译时,其实很多文件并没有改动,这些文件的重编译会浪费很多时间,有效的方法是在每 次编译时计算源文件的hash值和编译结果,下次做重编译时则根据hash值来决定是否需要真正编译,这里hash算法非常重要,因为一旦发生hash冲 突,则可能返回错误的编译结果。所以这里的hash算法绝不能选用校验和这样的简单算法,可以选用MD5这样的高强度算法。

ccache就是这样的工具,在编译时它会用MD4算法计算hash 值,并和编译结果缓存在预先设置的目录下(可以通过环境变量来设置这个缓存目录),每次重编译时,都可以使用原先的缓存大幅提高编译速度,我测试的结果, 在win32平台和GNU的编译工具链下,使用cygwin编译的ccache后,在源文件没有改变的情况下,重编译时间缩短60%。

对于第二种方法,分布式编译,则是通过分布在网络中的多台计算机的分布计算,真正提高编译速度。这比上一种方法要复杂的多,相应的成熟的工具也比较少,GNU环境下有一个著名的软件distcc, 就是这样的分布式编译工具。我在win32平台下用过distcc,可惜比较复杂(因为distcc设计是在*nix环境下使用的)。 在服务器端(就是替其他编译者编译)需要运行distccd,在客户端(发起编译者)则需要通过gnu make的多任务特性(--jobs参数)和运行distcc来达到分布编译的目的。我测试的结果,使用4台计算机,可以将编译时间缩短一半左右。

上面两种手段可以联合使用,进一步提高编译速度。所以ccache和distcc通常会在一起运行,可谓黄金搭档。 :)

0 Comments:

发表评论

<< Home