2013-03-04 105 views
18

我想盡量加快編譯C++項目的速度。他們有大約3M行代碼。用SSD加速編譯時間

當然,我並不需要總是編譯每個項目,但有時候會有很多源文件被其他人修改,我需要重新編譯所有這些文件(例如,有人更新源文件) 。

我測量過,編譯一箇中間項目(不涉及所有源文件)大約需要三分鐘。我知道這不是太多,但有時它真的很無聊等待編譯..我試圖將源代碼移動到一個固態硬盤(一箇舊的OCZ頂點3 60   GB),基準,它是從比HDD快5到60倍(特別是在隨機讀取/寫入時)。無論如何,編譯時間幾乎是相同的(可能快2-3秒,但它應該是一個機會)。

也許將Visual Studio bin移動到SSD會增加性能嗎?

只是爲了完成這個問題:我有一個W3520 Xeon @ 2.67 GHz和12   GB的DDR3 ECC。

+1

您可能對[this]感興趣(http://www.joelonsoftware.com/items/2009/03/27.html)。喬爾總結說它並沒有真正的幫助。 – BoBTFish 2013-03-04 10:31:05

+2

將所有與include頭文件無關的東西移動到實現文件中。儘量減少代碼中的#include指令,特別是在頭文件中。這通常會使意大利麪條項目的建造時間增加超過數量級。 – 2013-03-04 10:33:53

+2

@BoBTFish:應該注意的是,這篇文章有些陳舊(SSD現在比他用了3代以後),坦率地說,整體上也很荒謬。這傢伙花費$$$,因爲30秒重建時間「太慢」,然後將固態硬盤塞入老年筆記本中,以避免浪費寶貴的開發時間(並且浪費兩天時間設置它),並想知道爲什麼完全通過CPU進行編譯老年人筆記本電腦沒有得到更快的速度。認真對待這件事有些困難。 – Damon 2013-03-04 11:10:13

回答

7

C++編譯/鏈接受處理速度的限制,而不是HDD I/O。這就是爲什麼你沒有看到編譯速度有所增加。編譯器/鏈接器和必要的庫被讀入內存一次,並保持在那裏。)

我已經看到了一些小的加速從編譯C項目(比C++項目大量使用模板等耗費的時間更少)上將工作目錄移動到SSD或虛擬磁盤,但還不足以使其值得。

+5

開啓優化後處理速度非常重要(約10%的差異),但在未優化的版本中,SSD的速度確實比硬盤快3-4倍。當然,編譯器放置中間文件的臨時文件目錄也應該放在SSD上。然後,磁盤必須支持修剪,當然,或者這是一個非常短的旅程。 – Damon 2013-03-04 10:55:50

+2

這一切都很大程度上取決於您的構建環境和其他設置。例如。在我的主編譯服務器上,我有96GiB的RAM和16個內核。硬盤驅動器相當慢,但這並不重要,因爲所有內容都被緩存在RAM中。在我的桌面上(我有時也會編譯),我只有8Gib的RAM和6個內核。在那裏做同樣的並行編譯可能會大大加快,因爲6個並行運行的編譯器吃掉了足夠的內存,所以ssd速度差異非常明顯。 – PlasmaHH 2013-03-04 11:32:48

+0

@PlasmaHH也許你應該讓這個答案而不是評論,這個問題將受益於多個POV。 – us2012 2013-03-04 11:33:43

24

這一切都很大程度上取決於您的構建環境和其他設置。例如,在我的主編譯服務器上,我有96   GiB的RAM和16個內核。硬盤速度很慢,但這並不重要,因爲所有內容都被緩存在RAM中。

在我的桌面上(我有時也會編譯),我只有8個  RAM和六個內核。在那裏做同樣的並行構建可能會大大加快,因爲六個並行運行的編譯器吃掉了足夠的內存,SSD速度差異非常明顯。

有許多事情會影響構建時間,包括CPU與I/O「邊界」的比率。根據我的經驗(Linux上的GCC),它們包括:

  • 代碼的複雜性。大量的元模型使得它使用更多的CPU時間,更多類C代碼可能會使生成對象的I/O(更多)佔優勢
  • 臨時文件的編譯器設置,例如GCC的-pipe
  • 正在使用的優化。通常,更優化,CPU工作占主導地位。
  • 平行構建。一次編譯一個文件可能永遠不會產生足夠的I/O來獲取今天最慢的硬盤,達到任何限制。然而,可能會一次編譯八個核心(或更多)。
  • 正在使用的操作系統/文件系統。似乎過去的一些文件系統對許多並行構建的文件的訪問模式產生了阻礙,基本上將I/O瓶頸置於​​文件系統代碼中,而不是底層硬件。
  • 用於緩衝的可用RAM。操作系統可以緩衝你的I/O越積極,HDD速度就越不重要。這就是爲什麼有時一個make -j6可能比一個make -j4慢,儘管有足夠的空閒內核。

要長話短說:這取決於很多因素,因此做出任何「是的,它會幫助你」或者「不,它會幫助你不是」純粹的炒作,所以如果你有可能嘗試一下,做吧。但是不要花太多時間在上面,因爲每一個小時你都試圖將你的編譯時間減半,試着估計你(或者你的同事,如果有的話)多久可以重建項目,以及它與節省可能的時間。

+0

+1,很好的細節! – us2012 2013-03-04 11:50:08

+2

用於'-pipe'的+1:最好的優化是從我這裏減少工作 – 2013-03-04 13:33:47

+0

+1。我在YEARS之前使用了這個選項,但不知何故忘記它存在。 – 2014-03-30 17:44:50

4

我發現當代碼位於SSD(系統具有八核Core i7,12   GB RAM)時,編譯一個大約100萬行C++的項目加速了大約兩倍。實際上,我們獲得的最佳性能是使用一個SSD作爲系統,另一個作爲源代碼 - 這不是構建速度要快得多,而是操作系統響應速度更快,而大型構建正在進行中。

另一件造成巨大差異的事情是啓用平行建築。請注意,有兩個需要啓用兩個單獨的選項:

  • 菜單工具選項項目和解決方案→並行項目的最大數量建立
  • 項目屬性→C++ /一般多處理器編譯

多處理器compila它與其他一些標誌(包括最小重建,我認爲)是不兼容的,所以請檢查輸出窗口是否有警告。我發現使用MP編譯標誌設置所​​有內核的命中率接近100%,所以您至少可以看到CPU被大量使用。

-2

我確實用SSD替換了我的硬盤驅動器,希望能減少C++項目的編譯時間。簡單地用SSD替換硬盤驅動器並不能解決問題,兩者的編譯時間幾乎相同。

但是,在最初的失敗之後,我成功地將編譯速度提高了大約六倍。

執行以下步驟來提高編譯速度。

  1. 熄滅冬眠: 「POWERCFG -h關」 命令提示

  2. 熄滅驅動分度驅動器C上

  3. 縮水頁文件,以800分鐘/ 1024最大值(它最初設置爲系統管理的大小8092)。

+0

什麼系統? 32位Windows? Windows Vista 32位? – 2014-11-03 17:07:21

0

沒有提到的一點是,當使用ccache和高度並行構建時,您將看到使用SSD的好處。