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.
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:)
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.
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.
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.
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
Używam Unity Builds (Screencast znajdujący się tutaj).
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 .
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.
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).
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ł :)
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.
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.
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)
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