2016-05-19 100 views
7

我偶然發現了幾個關於改進CMake C++項目週轉時間的SO問題(如"At what level should I distribute my build process?""cmake rebuild_cache for just a subdirectory?"),我想知道是否有利用CMake提供的特定可能性的更一般的指導。如果可能沒有跨平臺編譯時優化,我主要對基於Visual Studio或GNU toochain的方法感興趣。如何加快我的CMake C++項目的編譯時間?

而且我已經瞭解並投資進入一般建議方面加快C++構建:

  1. 更改/優化/微調工具鏈

  2. 優化你的代碼庫/軟件體系結構(例如,通過減少的依賴關係,並使用良好定義的子項目 - 單元測試)

  3. 投資在一個更好的硬件(SSD,CPU,存儲器)

like like recommended herehere or here。所以我在這個問題上的重點是第一點。

另外,我知道的建議中的CMake的Wiki上找到:

前者只處理基本知識(並行make),後來把手大多是如何加快解析CMake文件。

只是爲了使這個多一點具體的,如果我從使用MSYS/GNU here 100庫我得到了以下time測量結果我的CMake的例子:

$ cmake --version 
cmake version 3.5.2 
CMake suite maintained and supported by Kitware (kitware.com/cmake). 

$ time -p cmake -G "MSYS Makefiles" .. 
-- The CXX compiler identification is GNU 4.8.1 
... 
-- Configuring done 
-- Generating done 
-- Build files have been written to: [...] 
real 27.03 
user 0.01 
sys 0.03   

$ time -p make -j8 
... 
[100%] Built target CMakeTest 
real 113.11 
user 8.82 
sys 33.08 

所以我有一個總的〜 140秒,我的目標 - 這個公認的非常簡單的例子 - 就是將其降低到標準設置/工具的10-20%。

回答

7

這裏就是我有很好的結果與用CMake和Visual Studio或GNU工具鏈:

  1. 交易所GNU使與Ninja。速度更快,可自動使用所有可用的CPU內核,並具有良好的依賴性管理。只需注意

    a。)您需要正確設置CMake中的目標依賴關係。如果達到構建對另一個構件有依賴關係的程度,則必須等到構建這些構件(同步點)爲止。

    $ time -p cmake -G "Ninja" .. 
    -- The CXX compiler identification is GNU 4.8.1 
    ... 
    real 11.06 
    user 0.00 
    sys 0.00 
    
    $ time -p ninja 
    ... 
    [202/202] Linking CXX executable CMakeTest.exe 
    real 40.31 
    user 0.01 
    sys 0.01 
    

    b)鏈接總是這樣的同步點。所以你可以更多地使用CMake的Object Libraries來減少這些,但是它會讓你的CMake代碼變得有點醜陋。

    $ time -p ninja 
    ... 
    [102/102] Linking CXX executable CMakeTest.exe 
    real 27.62 
    user 0.00 
    sys 0.04 
    
  2. 拆分不經常改變或穩定的代碼部分爲獨立的CMake的項目和使用的CMake的ExternalProject_Add()或者 - 如果你如切換到某些庫的二進制傳送 - find_library()

  3. 爲您的日常工作考慮一組不同的編譯器/鏈接器選項(但前提是您對最終版本構建選項也有一定的測試時間/經驗)。

    一)跳過優化部分

    灣)嘗試增量鏈接

  4. 如果你經常做更改CMake的代碼本身,想從您的計算機的體系結構優化的源重建CMake的。 CMake正式分發的二進制文件只是在每種可能的CPU架構上進行的妥協。

    當我使用MinGW64/MSYS重建CMake 3.5.2時,如果你的文件I/O是非常緩慢的,因爲CMake的工作有專門的二進制輸出目錄,使用RAM磁盤的

    $ time -p [...]/MSYS64/bin/cmake.exe -G "Ninja" .. 
    real 6.46 
    user 0.03 
    sys 0.01 
    
  5. cmake -DCMAKE_BUILD_TYPE:STRING="Release" 
         -DCMAKE_CXX_FLAGS:STRING="-march=native -m64 -Ofast -flto" 
         -DCMAKE_EXE_LINKER_FLAGS:STRING="-Wl,--allow-multiple-definition" 
         -G "MSYS Makefiles" .. 
    

    我可以加速的第一部分。如果您仍然使用硬盤,請考慮切換到固態硬盤。

  6. 根據您的最終輸出文件,將GNU標準鏈接器與Gold Linker交換。 LLVM項目甚至比Gold Linker更快。您必須檢查它是否已經支持您平臺上的所需功能。使用Clang/c2而不是Visual C++編譯器。從Visual C++團隊提供的Visual C++編譯器性能建議,請參閱https://blogs.msdn.microsoft.com/vcblog/2016/10/26/recommendations-to-speed-c-builds-in-visual-studio/

  7. Increadibuild可以提高編譯時間。

參考

+0

此外,使用的ccache。它使瘋狂快速重新編譯。 – csl

+0

如果您的構建系統正在進行增量重建,ccache應該沒有什麼幫助。在精心編寫的cmake構建中,增量構建是正確的,ccache實際上會減慢你的開銷。在過去,我曾在ccache上成功地使用sucky編譯系統進行增量編譯,但是(firefox,多年前) –