2016-05-19 11 views
7

Natknąłem się na kilka pytań dotyczących SO dotyczących konkretnych aspektów związanych z poprawą czasu oczekiwania na projekty CM + C++ w ostatnim czasie (np. "At what level should I distribute my build process?" lub "cmake rebuild_cache for just a subdirectory?"), zastanawiałem się, czy istnieją bardziej ogólne wskazówki wykorzystujące konkretne możliwości, jakie oferuje CMake. Jeśli prawdopodobnie nie ma optymalizacji czasu kompilacji między platformami, interesują mnie głównie podejścia oparte na Visual Studio lub GNU oparte na toochainach.Jak przyspieszyć czas kompilacji mojego projektu C++ w CMake?

I jestem już świadoma i inwestowanie w ogólnie zalecanych obszarach przyspieszyć C++ buduje:

  1. Zmień/Optymalizacja/dostroić toolchain

  2. Optymalizacja kodu bazowego/architektura oprogramowania (na przykład poprzez zmniejszenie zależności i używać dobrze zdefiniowanych podprojektów - testy jednostkowe)

  3. zainwestować w lepszy sprzęt (SSD, procesor, pamięć)

jak zalecane here, here lub here. Więc moje skupienie na tym pytaniu dotyczy pierwszego punktu.

Plus wiem zaleceń można znaleźć w CUpewnij w encyklopedii:

Były tylko uchwyty podstawy (marka równoległe), późniejszy uchwyty przeważnie jak przyspieszyć parsowanie plików CMake.

Właśnie zrobić to trochę bardziej konkretny, jeśli biorę przykład CUpewnij z here z 100 bibliotek wykorzystujących Msys/GNU mam następujący time wyniki pomiaru:

$ 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 

Więc mam w sumie ~ 140 sekund, a moim celem - z tego bardzo prostego przykładu - byłoby zejście do 10-20% tego, co otrzymuję dzięki standardowym ustawieniom/narzędziom.

Odpowiedz

7

Oto co miałem dobre wyniki z użyciem CMake i Visual Studio lub toolchain GNU:

  1. Exchange GNU uczynić z Ninja. Jest szybszy, automatycznie wykorzystuje wszystkie dostępne rdzenie procesora i ma dobre zarządzanie zależnościami. Wystarczy pamiętać o

    a.) Musisz poprawnie ustawić zależności celu w CMake. Jeśli dojdziesz do punktu, w którym kompilacja ma zależność od innego artefaktu, musi poczekać, aż zostaną skompilowane (punkty synchronizacji).

    $ 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.) Łączenie jest zawsze takim punktem synchronizacji. Możesz więc w większym stopniu używać CMake'a Object Libraries, aby je zredukować, ale sprawia to, że twój kod CMake jest trochę brzydszy.

    $ time -p ninja 
    ... 
    [102/102] Linking CXX executable CMakeTest.exe 
    real 27.62 
    user 0.00 
    sys 0.04 
    
  2. Podział rzadziej zmieniane lub stabilne części kodu do oddzielnych projektów CUpewnij i używać CUpewnij na ExternalProject_Add() lub - jeśli na przykład przełącz na binarne dostarczanie niektórych bibliotek - find_library().

  3. Pomyśl o innym zestawie opcji kompilatora/łącznika do codziennej pracy (ale tylko wtedy, gdy masz również trochę czasu/doświadczenia z opcjami kompilacji końcowego wydania).

    a.) Przejdź części optymalizacji

    b.) Spróbuj przyrostowe łączenie

  4. Jeśli często robić zmiany w kodzie CMake sama, pomyśleć o odbudowie CMake ze źródeł zoptymalizowanych dla architektury Twojego urządzenia. Oficjalnie dystrybuowane binarki CMake to tylko kompromis do pracy nad każdą możliwą architekturą procesora.

    Kiedy używam MinGW64/MSYS do odbudowania CMake 3.5.2 z np.

    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" .. 
    

    mogę przyspieszyć część pierwsza:

    $ time -p [...]/MSYS64/bin/cmake.exe -G "Ninja" .. 
    real 6.46 
    user 0.03 
    sys 0.01 
    
  5. Jeśli plik I/O jest bardzo powolny, a od CUpewnij współpracuje z dedykowanymi binarnych katalogów wyjściowych, skorzystać z dysku RAM. Jeśli nadal używasz dysku twardego, rozważ przejście na dysk SSD.

  6. W zależności od ostatecznego pliku wyjściowego, wymień standardowy łącznik GNU na Gold Linker. Jeszcze szybciej niż Gold Linker jest lld z projektu LLVM. Musisz sprawdzić, czy obsługuje już potrzebne funkcje na twojej platformie.

  7. Użyj Clang/c2 zamiast kompilatora Visual C++. Dla Visual C++ zalecenia wydajności kompilator są oferowane w Visual C++ zespole, patrz https://blogs.msdn.microsoft.com/vcblog/2016/10/26/recommendations-to-speed-c-builds-in-visual-studio/

  8. Increadibuild może zwiększyć czas kompilacji.

Odniesienia

+0

również zastosowanie ccache. Powoduje to niesamowicie szybkie rekompilacje. – csl

+0

Jeśli Twój system kompilacji prawidłowo wykonuje odbudowy przyrostowe, ccache nie powinno być pomocne. Na dobrze napisanej kompilacji cmake, która robi przyrostowe kompilacje w prawo, ccache w rzeczywistości spowalnia z nadwyżką. W przeszłości miałem powodzenie z ccache na projektach z systemami budującymi szczątki, które nie tworzyły przyrostowej kompilacji (firefox, lata temu) –

Powiązane problemy