2008年6月18日 星期三

compile speed up tip

寫程式時遇到比較大的程式時,常常要花許多時間在compile上,有幾個可以加速compile的小tip,可以參考。

1.ccache
這是object file的cache的工具。基本的運作原理就是他會在compile做完preprocess之後,把compiler的版本,使用的參數及做完preprocess後的內容做出一個checksum,用以判斷程式碼是否有改變,沒改變時就可以把cache裡的檔案拿出來用。除非你一次改了大部分的程式,通常都會有一定效率改善。不過一般人寫程式時,也不太會改了一大堆再來compile。你如果是這樣,那要考慮一下,這不是個好習慣。

2.parallel compile
很多的building tool都會支援parallel compile。像許多人用的gnu make就有不錯的支援,可以同時compile獨立的部分。以gnu make為例,使用make -j[] 就能使用parallel compile,還可以用"-l"限制不要使用過多的system resource。據說以讓task數量為cpu的二到三倍時的效率會最好。但是使用parallel compile時,一定要注意好depency的部分。gcc也可以幫助你產生depency check list.

3.如果你compile時使用到network的 resource,例如很多人會使用nas當storage。那linking時object或library的大小也會影響到linking的速度,可以考慮把library copy到load disk,這樣在network resource比較吃緊時也會有幫助。不過如果bandwidth很充足時,改善的空間可能就不大了。

4.disk種類
另外在使用load disk時不管是直接在loadl disk compile或是當compile temp,disk的種類也會有影響。一般而言scsi在多工時的效率會比ide/sata好,但是要強調的是多人多工時,而不是瞬間存取速度。如果你只有自己一個人在用,可能感覺不太出差異。

5.RAID type
如果你使用RAID當你的storage,那你至少要了解RAID 0到RAID 5 的不同。對資料的保護方式不同,存取速度當然也就不同。現在RAID不算貴,連很多家用nas都支援RAID,我想這是很多人都可以考慮的調整選項。

PS.來一個跟以上比較不一樣的,如果你使用C/C++,不必要的header就不要include,可以減少compile時對header的checking和parsing,也能減少disk io。不過最重要的其實是減少你程式裡無謂的depency。