2016-05-19 37 views
7

私はcmakeのが提供する特定の可能性を活用し、より一般的なガイダンスがある場合、私は思っていた、("At what level should I distribute my build process?"または"cmake rebuild_cache for just a subdirectory?"など)、最近C++プロジェクトを有効にCMakeのターンアラウンドタイムの​​向上の特定の側面に関するいくつかのSOの質問に出くわしました。おそらく、クロスプラットフォームのコンパイル時間の最適化がない場合、私は主にVisual StudioやGNUのあまりにも簡単な方法に興味があります。CMake対応のC++プロジェクトのコンパイル時間を短縮するには?

そして、私はすでにの意識だとスピードアップするために、一般的に推奨される分野に投資するC++のビルド:

  1. 変更/最適化/微調整ツールチェーン

  2. は/あなたのコードベースを最適化ソフトウェアアーキテクチャ(例えば、依存関係を減らし、明確に定義されたサブプロジェクトを使用することによってユニットテスト)

(推奨herehereまたはhereなど)。だからこの質問の焦点は最初の点です。

プラス私CMakeののWikiにする勧告を知っている:前者はちょうど基礎(パラレルメイク)を扱う、後でハンドルは、主にどのように

CMakeファイルの解析をスピードアップします。ちょうどこのもう少しコンクリートを作るために

私はMSYS/GNUを使用して100のライブラリとhereから私CMakeの例を取る場合、私は次のtime測定結果ました:だから私は〜の合計を

$ 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コアを自動的に使用し、良好な依存関係管理を行います。ただ、

    に注意してください。)あなたが正しくセットアップに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. 日常の作業には異なるコンパイラ/リンカオプションがあると考えてください(ただし、最終リリースビルドオプションでのテスト時間/経験がある場合のみ)。

    。)最適化の部品

    Bをスキップします。)インクリメンタル

  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に交換してください。 Gold Linkerは、LLVMプロジェクトのlldです。プラットフォーム上で必要な機能がすでにサポートされているかどうかをチェックする必要があります。

  7. Visual C++コンパイラの代わりにClang/c2を使用してください。 Visual C++コンパイラのパフォーマンスに関する推奨事項は、Visual C++チームから提供されています。https://blogs.msdn.microsoft.com/vcblog/2016/10/26/recommendations-to-speed-c-builds-in-visual-studio/

  8. Increadibuildコンパイル時間を短縮できます。また

参照

+0

、ccacheを使用します。それは非常に速く再コンパイルを行います。 – csl

+0

ビルドシステムが増分リビルドを適切に実行している場合、ccacheはほとんど役に立ちません。インクリメンタルビルドを正しく行う、よく書かれたcmakeビルドでは、ccacheは実際にオーバーヘッドであなたの速度を低下させます。私は過去に、インクリメンタルなコンパイルをしていなかったサックィーなビルドシステムを使ったプロジェクトでccacheを成功させましたが(firefox、数年前) –

関連する問題