2013-03-04 15 views
18

Chcę spróbować przyspieszyć mój czas kompilacji naszych projektów C++. Mają około 3M linii kodu.Przyspiesz czas kompilacji z SSD

Oczywiście nie muszę zawsze kompilować każdego projektu, ale czasami jest wiele plików źródłowych zmodyfikowanych przez innych i muszę je wszystkie skompilować (na przykład, gdy ktoś zaktualizuje plik źródłowy o ASN.1) .

Zmierzyłem, że skompilowanie projektu pośredniego (który nie obejmuje wszystkich plików źródłowych) zajmuje około trzech minut. Wiem, że to nie jest za dużo, ale czasami jest to naprawdę nudne oczekiwanie na kompilację ...

Próbowałem przenieść kod źródłowy na dysk SSD (stary OCZ Vertex 3 60   GB), który, testowany, pochodzi z Od 5 do 60 razy szybciej niż dysk twardy (zwłaszcza przy losowym odczycie/zapisie). W każdym razie czas kompilacji jest prawie taki sam (może 2-3 sekundy szybciej, ale powinno być szansą).

Może przeniesienie bin Visual Studio na dysk SSD przyniosłoby dodatkowy przyrost wydajności?

Wystarczy, aby ukończyć pytanie: Mam W3520 Xeon @ 2,67 GHz i 12   GB DDR3 ECC.

+1

Możesz być zainteresowany [tą] (http://www.joelonsoftware.com/items/2009/03/27.html). Joel stwierdził, że to naprawdę nie pomogło. – BoBTFish

+2

Przenieś wszystko, co niezwiązane z plikami nagłówkowymi, do plików implementacji. Zmniejsz liczbę dyrektyw #include w swoim kodzie, szczególnie w plikach nagłówkowych do niezbędnego minimum. To zazwyczaj przyspiesza czas budowy projektu spaghetti o ponad rząd wielkości. –

+2

@BoBTFish: Należy zauważyć, że ten artykuł jest nieco stary (dyski SSD są obecnie 3 pokolenia poza tym, z czego korzystał) i, szczerze mówiąc, ogólnie całkiem śmieszne. Ten facet wydaje $$$, ponieważ 30 sekund czasu odbudowy jest "zbyt wolne", a następnie umieszcza dysk SSD w starszym zeszytach, aby uniknąć marnowania cennego czasu dev (i marnuje dwa dni na konfigurowanie go) i zastanawia się, dlaczego cała kompilacja związana z CPU ten starszy notebook nie działa szybciej. Ciężko jest potraktować to poważnie. – Damon

Odpowiedz

7

Kompilacja/łączenie w C++ jest ograniczona szybkością przetwarzania, a nie wejściem/wyjściem HDD. Właśnie dlatego nie widać wzrostu prędkości kompilacji. (Przeniesienie plików binarnych kompilatora/łącznika na dysk SSD nic nie da. Podczas kompilowania dużego projektu kompilator/linker i niezbędna biblioteka zostają wczytane do pamięci i pozostają tam.)

Widziałem kilka drobnych przyspieszeń od przenoszenia katalogu roboczego do SSD lub ramdysku podczas kompilowania projektów C (co jest o wiele mniej czasochłonne niż projekty C++, które intensywnie wykorzystują szablony itp.), ale nie na tyle, aby było to warte.

+5

Szybkość przetwarzania ma duże znaczenie przy włączonych optymalizacjach (różnica około 10%), ale na niezoptymalizowanej kompilacji SSD jest rzeczywiście około 3-4 razy szybszy niż dysk twardy. Oczywiście katalog plików tymczasowych, w którym kompilator umieszcza pliki pośrednie, powinien również znajdować się na dysku SSD. A potem dysk musi wspierać trymowanie oczywiście, lub jest to bardzo krótka podróż. – Damon

+2

Wszystko to w dużym stopniu zależy od środowiska kompilacji i innych ustawień. Na przykład. na moim głównym serwerze kompilacji mam 96GiB pamięci RAM i 16 rdzeni. HDD jest raczej powolny, ale to nie ma znaczenia, ponieważ wszystko jest buforowane w pamięci RAM. Na moim pulpicie (gdzie czasami też kompiluję) mam tylko 8 Gibów RAM i 6 rdzeni. Wykonanie tej samej równoległej kompilacji może być znacznie przyspieszone, ponieważ 6 równoległych kompilatorów pobiera wystarczającą ilość pamięci, aby różnica prędkości SSd była bardzo zauważalna. – PlasmaHH

+0

@PlasmaHH Być może powinieneś zrobić to zamiast komentarza, to pytanie będzie korzystało z posiadania więcej niż jednego POV. – us2012

24

Wszystko to w dużym stopniu zależy od środowiska kompilacji i innych ustawień. Na przykład na moim głównym serwerze kompilacji mam 96   GiB pamięci RAM i 16 rdzeni. Dysk twardy jest dość powolny, ale to nie ma znaczenia, ponieważ wszystko jest buforowane w pamięci RAM.

Na moim pulpicie (gdzie czasami też kompiluję) mam tylko 8   Gib RAM i sześć rdzeni. Wykonanie tej samej równoległej kompilacji może być znacznie przyspieszone, ponieważ sześć kompilatorów działających równolegle zużywa wystarczająco dużo pamięci, aby różnica prędkości SSD była bardzo zauważalna.

Istnieje wiele czynników, które wpływają na czas budowy, w tym stosunek "CPU" do "granicy" procesora I/O. Z mojego doświadczenia (GCC w systemie Linux) należą:

  • Złożoność kodu. Wiele metatablic sprawia, że ​​zużywa on więcej czasu procesora, więcej kodu podobnego do C może sprawić, że wejścia/wyjścia wygenerowanych obiektów (więcej) będą dominujące
  • Ustawienia kompilatora dla plików tymczasowych, takich jak -pipe dla GCC.
  • Stosowana optymalizacja. Zwykle im większa optmizacja, tym bardziej dominuje praca procesora.
  • Równoległe kompilacje. Kompilowanie pojedynczego pliku w tym samym czasie prawdopodobnie nigdy nie wytworzy wystarczającej liczby operacji wejścia/wyjścia, aby uzyskać najwolniejszy z dotychczasowych dysków twardych. Kompilacja z ośmioma rdzeniami (lub więcej) na raz może jednak.
  • Używany system plików/OS. Wygląda na to, że niektóre systemy plików w przeszłości dławiły wzorce dostępu dla wielu plików wbudowanych równolegle, zasadniczo wprowadzając wąskie gardło we/wy do kodu systemu plików, a nie do sprzętu bazowego.
  • Dostępna pamięć RAM do buforowania. Im bardziej agresywny system operacyjny może buforować twoje operacje wejścia/wyjścia, tym mniej ważna jest szybkość dysku twardego. Dlatego czasami make -j6 może być wolniejszy niż make -j4, mimo że ma wystarczająco dużo wolnych rdzeni.

Krótko mówiąc: To zależy od wystarczającej ilości rzeczy, aby zrobić "tak, to ci pomoże" lub "nie, to nie pomoże" czystej spekulacji, więc jeśli masz możliwość wypróbowania tego , Zrób to. Ale nie spędzaj na nim zbyt wiele czasu, bo co godzinę próbujesz skrócić czasy kompilacji na pół, spróbuj oszacować, jak często (lub twoi współpracownicy, jeśli masz jakieś) mógłbyś przebudować projekt i jak to się ma do możliwe zaoszczędzenie czasu.

+0

+1, świetne szczegóły! – us2012

+2

+1 dla '-pipe': najlepszą optymalizacją jest zmniejszenie pracy –

+0

+1 również dla mnie. Użyłem tej opcji LATA temu, ale jakoś zapomniałem, że to istniało. –

4

Znalazłem, że kompilacja projektu około 1 miliona wierszy C++ przyspieszyła o około dwa razy, gdy kod był na dysku SSD (system z ośmioma rdzeniami Core i7, 12   GB RAM). Właściwie, najlepszą możliwą wydajnością był jeden dysk SSD dla systemu i drugi dla źródła - nie było tak, że kompilacja była o wiele szybsza, ale system operacyjny był znacznie bardziej responsywny, podczas gdy trwała duża kompilacja.

Kolejną istotną różnicą było umożliwienie równoległego budowania. Należy pamiętać, że istnieją dwa oddzielne opcje, które oba muszą być włączone:

  • Menu NarzędziaOpcjeprojekty i rozwiązania → maksymalna liczba projektu równolegle buduje
  • właściwości projektu → C++/OgólneWielu procesor kompilacja

wieloprocesorowych compila jest niekompatybilna z kilkoma innymi flagami (w tym minimalnym przebudowaniem, tak myślę), więc sprawdź okno wyjściowe pod kątem ostrzeżeń. Zauważyłem, że przy ustawieniu flagi kompilacji MP wszystkie rdzenie uderzają blisko 100% obciążenia, więc możesz przynajmniej zobaczyć, że procesor jest agresywnie wykorzystywany.

-2

Zamieniłem dysk twardy na SSD mając nadzieję, że skróci to czas kompilacji mojego projektu C++. Samo zastąpienie dysku twardego dyskiem SSD nie rozwiązało problemu, a czas kompilacji z obydwoma był prawie taki sam.

Jednak po początkowych błędach pomyślnie przyspieszyłem kompilację o około sześć razy.

Wykonano następujące czynności, aby zwiększyć prędkość kompilacji.

  1. Wyłączony hibernacji "powercfg -h off" poleceń

  2. Wyłączony indeksowanie dysku na dysk C

  3. skurczowych strony plik do 800 min/max 1024 (było początkowo ustawiony na system zarządzany rozmiar 8092).

+0

Jaki system? 32-bitowy system Windows? Windows Vista 32-bitowy? –

0

Nie wspomniano o jednym punkcie, że przy korzystaniu z ccache i wysoce równoległej kompilacji, można zauważyć korzyści z używania dysku SSD.

Powiązane problemy