Jak skrócić czas kompilacji i linkowania dla projektów Visual C++ (native C++)?

Jak skrócić czas kompilacji i linkowania dla projektów VC++ (natywny C++)?

Proszę określić, czy każda sugestia dotyczy debugowania, wydania lub obu.

Author: Peter Mortensen, 2008-12-13

12 answers

Może to wydawać się oczywiste dla ciebie, ale staramy się używać deklaracji forward w jak największym stopniu, nawet jeśli wymaga to wypisania długich nazw przestrzeni nazw, w których znajduje się Typ(y):

// Forward declaration stuff
namespace plotter { namespace logic { class Plotter; } }

// Real stuff
namespace plotter {
    namespace samples {
        class Window {
            logic::Plotter * mPlotter;
            // ...
        };
    }
}

Znacznie skraca czas kompilacji również na innych kompilatorach. Rzeczywiście dotyczy to wszystkich konfiguracji:)

 44
Author: Johannes Schaub - litb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-25 21:55:55

Użyj wzoru uchwytu / Korpusu (czasami znanego również jako "pimpl", "adapter", "dekorator", "most" lub "wrapper"). Izolując implementację swoich klas do swoich .pliki cpp, muszą być skompilowane tylko raz. Większość zmian nie wymaga zmian w pliku nagłówkowym, więc oznacza to, że można wprowadzać dość obszerne zmiany, jednocześnie wymagając tylko rekompilacji jednego pliku. Zachęca to również do refaktoryzacji i pisania komentarzy i testów jednostkowych, ponieważ czas kompilacji jest krótszy. Dodatkowo, automatycznie oddzielasz kwestie związane z interfejsem i implementacją, dzięki czemu interfejs Twojego kodu jest uproszczony.

 21
Author: 1800 INFORMATION,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-12 23:01:56

Jeśli masz duże złożone nagłówki, które muszą być zawarte przez większość .pliki cpp w procesie budowania, które nie są zmieniane bardzo często, można je wstępnie skompilować. W projekcie Visual C++ z typową konfiguracją jest to po prostu kwestia włączenia ich do stdafx.h. Ta funkcja ma swoje wady, ale biblioteki, które w pełni wykorzystują szablony, zazwyczaj mają wiele rzeczy w nagłówkach, a wstępnie skompilowane nagłówki są najprostszym sposobem na przyspieszenie kompilacji w tym przypadku.

 13
Author: Daniel Earwicker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-12 22:46:56

Te rozwiązania dotyczą zarówno debugowania, jak i wydania i koncentrują się na bazie kodu, która jest już duża i uciążliwa.

Deklaracje terminowe są wspólnym rozwiązaniem.

Rozproszone budowanie, takie jak z Incredibuild to wygrana.

Przesuwanie kodu z nagłówków w dół do plików źródłowych może zadziałać. Małe klasy, stałe, liczby itd. mogą zaczynać się w pliku nagłówkowym po prostu dlatego, że mógł być używany w wielu jednostkach kompilacji, ale w rzeczywistości są używane tylko w jednym i mogą być przeniesione do pliku cpp.

Rozwiązaniem, o którym nie czytałem, ale używałem, jest dzielenie dużych nagłówków. Jeśli masz garść bardzo dużych nagłówków, spójrz na nich. Mogą one zawierać powiązane informacje, a także mogą zależeć od wielu innych nagłówków. Weź elementy, które nie mają zależności od innych plików...proste struktury, stałe, enumery i deklaracje forward i przenoszą je z the_world.h do the_world_defs.h. Możesz teraz dowiedzieć się, że wiele z twojego źródła pliki mogą teraz zawierać tylko the_world_defs.h i unikać włączania wszystkich tych kosztów.

Visual Studio ma również opcję "Pokaż zawiera", która daje poczucie, które pliki źródłowe zawierają wiele nagłówków i które pliki nagłówkowe są najczęściej dołączane.

W przypadku bardzo popularnych includów, rozważ umieszczenie ich w wstępnie skompilowanym nagłówku.

 8
Author: Drew Dormann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-12 23:13:28
 8
Author: OJ.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-17 11:25:05

Pytanie o prędkość kompilacji jest na tyle interesujące, że Stroustrup ma je w swoimFAQ .

 7
Author: David Norman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-09 18:30:33

Używamy Incredibuild Xoreax do uruchamiania kompilacji równolegle na wielu maszynach.

 7
Author: crashmstr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-28 11:49:50

Również ciekawy artykuł od Neda Batcheldera: http://nedbatchelder.com/blog/200401/speeding_c_links.html (O C++ w Windows).

 5
Author: Paweł Hajdan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-29 12:24:44

Nasze maszyny programistyczne są czterordzeniowe i używamy Visual Studio 2008 obsługuje kompilację równoległą. Nie jestem pewien, czy wszystkie edycje VS mogą to zrobić.

Mamy plik rozwiązań zawierający około 168 indywidualnych projektów, a skompilowanie w ten sposób zajmuje około 25 minut na naszych czterordzeniowych maszynach, w porównaniu do około 90 minut na jednordzeniowych laptopach, które dajemy letnim studentom. Nie do końca porównywalne maszyny, ale masz pomysł :)

 4
Author: Chris Cameron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-12 21:55:25

W Visual C++ istnieje metoda, określana jako Unity, która znacznie poprawia czas łącza poprzez zmniejszenie liczby modułów obiektowych.

Polega to na łączeniu kodu C++, zwykle w grupach przez Bibliotekę. To oczywiście znacznie utrudnia edycję kodu i napotkasz kolizje przestrzeni nazw, chyba że dobrze ich użyjesz. Nie pozwala na używanie "using namespace foo";

Kilka zespołów w naszej firmie ma rozbudowane systemy do pobierania normalnych plików C++ i połącz je w czasie kompilacji jako krok budowania. Skrócenie czasu połączenia może być ogromne.

 2
Author: Matt Shaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-25 21:59:43

Inną użyteczną techniką jest blobbing. Myślę, że jest to coś podobnego do tego, co opisał Matt Shaw.

Mówiąc najprościej, po prostu tworzysz jeden plik cpp, w którym dołączasz inne pliki cpp. Możesz mieć dwie różne konfiguracje projektu, jedną zwykłą i jedną blob. Oczywiście blobbing nakłada pewne ograniczenia na Twój kod, np. nazwy klas w nienazwanych przestrzeniach nazw mogą się ze sobą kolidować.

Jedna z technik pozwalająca uniknąć przekompilowania całego kodu w blob (jak wspomniał David Rodríguez), gdy Zmień jeden plik cpp - ma mieć swój "działający" blob, który jest tworzony z plików ostatnio zmodyfikowanych i innych zwykłych Blob.

Używamy blobbingu w pracy przez większość czasu, co skraca czas tworzenia projektu, szczególnie czas łącza.

 1
Author: alariq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-25 22:01:30

Czas Kompilacji:
Jeśli masz IncrediBuild, czas kompilacji nie będzie problemem. Jeśli nie masz IncrediBuild, wypróbuj metodę "unity build". Łączy wiele plików cpp w jeden plik cpp, dzięki czemu cały czas kompilacji jest skrócony.
Czas Połączenia:
Metoda "unity build" również przyczynia się do skrócenia czasu połączenia, ale niewiele. Jak to możliwe, możesz sprawdzić, czy" cała globalna optymalizacja "i" LTCG " są włączone, podczas gdy te flagi sprawiają, że program jest szybki, robią łącze wolne.
Spróbuj wyłączyć" Whole Global Optimization "i ustaw LTCG na "Default" czas łącza może zostać skrócony o 5/6.
(LTCG to skrót od Link Time Code Generation)

 0
Author: Jeff Jiang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-05 07:14:53