C++ skompilować czasy bitwy dla każdego projektu powyżej pewnej wielkości. Na szczęście, przy tak dużej liczbie osób piszących duże projekty w C++, istnieje wiele różnych rozwiązań:
Klasycznym, tanim rozwiązaniem jest "budowanie jedności". Oznacza to po prostu użycie #include
, aby umieścić wszystkie pliki .cpp w jednym pliku do kompilacji. "Unity build" pojawił się w wielu pytaniach tutaj na stackoverflow, here jest najbardziej znanym, o którym wiem. Ten screencast pokazuje, jak skonfigurować taką kompilację w Visual Studio.
Rozumiem, że kompilacje jedności są znacznie szybsze niż klasyczne, ponieważ skutecznie buforują pracę wykonaną przez preprocesor i łącznik. Jedną wadą kompilacji jedności jest to, że jeśli dotkniesz jednego pliku cpp, przekompilujesz "duży" plik cpp. Możesz obejść ten problem, przełamując plik cpp, który jest iterowany, z kompilacji jedności i kompilując ją samodzielnie.
Beyond Jedność buduje, oto lista moich najlepszych praktyk:
- Zastosowanie
#include
tylko gdy neccessary, wolą przodu deklaracji
- Użyj pimpl idiom utrzymać realizację klasy z powszechnie włączonych plików nagłówkowych. Dzięki temu można dodawać elementy do implementacji bez ponownej rekompilacji
- Używać prekompilowanych nagłówków (pch) dla często dołączanych plików nagłówkowych, które rzadko zmieniają się
- Upewnij się, że twój system kompilacji używa wszystkich dostępnych rdzeni na lokalnym sprzęcie
- przechowywać listę katalogów preprocesor musi szukać minimal, użyj precyzyjnych ścieżek w
#include
sprawozdania
- Korzystając
#pragma once
na górze plików nagłówkowych zamiast #ifndef __FOO_H #define __FOO_H ... #endif
, jeśli używasz #ifndef
lewę kompilator będzie mieć aby otworzyć plik nagłówkowy za każdym razem, gdy jest włączony, #pragma once
al obniża kompilator, aby być bardziej wydajnym
Jeśli robisz to wszystko (budowanie jedności zrobi największą różnicę, z mojego doświadczenia), ostatnią opcją jest rozproszony budynek. distcc to najlepsze darmowe rozwiązanie, o którym wiem, że jest to zastrzeżony standard branżowy. Jestem zdania, że przetwarzanie rozproszone będzie jedynym sposobem na uzyskanie doskonałych czasów iteracji z nieuporządkowanego procesu kompilacji C++. Jeśli masz dostęp do dość dużej liczby maszyn (powiedzmy 10-20), to jest to całkowicie warte zainteresowania. Powinienem wspomnieć, że budowanie jedności i rozproszone kompilacje nie są całkowicie symbiotyczne, ponieważ tradycyjna kompilacja może zostać podzielona na mniejsze części pracy niż kompilacja jedności. Jeśli chcesz je rozpowszechniać, prawdopodobnie nie warto konfigurować jedności.
Mówisz, że - buduj wszystko, niczego nie zmieniaj, a wszystko jeszcze raz skompilujesz? –
Xoreax Incredibuild, choć nie tanie, bardzo pomaga. Regularnie otrzymujemy przyspieszenia> 10x. To powiedziawszy, zerwane zależności nadal bardzo boli, ponieważ wymusza kosztowne ponowne łączenie. – MSalters