[BCB] Przyśpieszenie kompilacji

0

Witam Szanownych Forumowiczów :)

Czy ktoś wie jak skutecznie zwiększyć prędkość kompilacji projektu w BCB6?

W opcjach projektu korzystam z opcji Cache pre-compiled headers, ustawiam Code Optimization na None.Tymczasem projekt złożony z około 50 formatek kompiluje 25 000 000 linii i trwa to około 20 minut (!) Do projektu dołączany jest plik do obsługi Excela (Excel_2k_srvr.h), ale bez niego kompilacja trwa niewiele krócej.

Nie wiem czy ma to wpływ, ale zauważyłem, że projekty, które wykorzystują formatki tworzone w sposób dynamiczny kompilują się znacznie dłużej (a może to tylko przypadek?).
Słaby sprzęt odpada, bo pracuję na raczej dobrym (P4 2.4GHz, 512MB RAM)

Czy ktoś może pomóc coś w związku z problemem?

Z góry dziękuję

0

Jeśli masz antywirusa to sprawdź czy nie masz włączonej opcji skanowania wszystkich otwieranych plików, ładowanych dll'i itd. Raz miałem taki przypadek przy kompilacji i po wyłączeniu tej opcji było git.

Z drugiej strony, co tu się oszukiwać, C++ Builder nie jest demonem prędkości ;)

0

Antywirusa mam "unieszkodliwionego" na razie, więc nie tu tkwi przyczyna.

Wiem, że Builder to nie demon prędkości, ale coś mi tu nie gra... Poza tym: 3 takie kompilacje to godzina straty, a niestety nie mogę sobie na to pozwalać :(

Może ktoś wie gdzie szukać informacji?

0

Optimizing C++Builder compile times <- poszukaj w pomocy Builder'a tego tematu.

PS. Dla porównania dodam, że u mnie 6000000 linii BCB 5.0 kompiluje (opcja Build All) w 1 minutę (Duron 950, 128MB, WinXP)

0

Dzięki za wskazówkę - przeczytałem, poklikałem, ale w dalszym ciągu niewiele mi to pomogło :(

Cóż, chyba w przerwie na kompilację będę sobie robił herbatkę - tylko kto wypije tyle herbaty? ;)

0

Pogooglowałem trochę i znalazłem sposób na przyśpieszenie. Teoretycznie pozwala na przyśpieszenie nawet 10-krotne - u mnie tylko (albo aż) dwukrotne.
Należy po prostu skorzystać z programu make.exe z poziomu konsoli.
Robimy co następuje:

Project -> Export Makefile

a następnie w kosoli (cmd/command):

make -B -f nazwa_pliku.mak

i już :)

W moim przypadku czas poświęcony na kompilowanie "spadł" z około 30 minut do 15-16 minut.

0

25M linii to troszkę przesada dla kompilatora ;)
Założę się że masz tam kilkaset funkcji i wiesz które z nich są sprawne w 100%.
Wywal te funkcje do całkiem osobnego projektu i skompiluj to jako biblioteka - będziesz miał jeden lub kilka(set) plików .obj zależnie czy wszystkie funkcje dasz do jednego pliku czy każdą do osobnego

Jeśli wszystkie gotowe funkcje będą w jednym pliku to zlinkuj w głównym projekcie owy plik .obj, a jeśli każda funkcja osobno to wpakuj wszystkie pliki .obj to liba (link.exe -lib *.obj /out:mojefunkcje.lib) i zlinkuj mojefunkcje.lib do głównego projektu

Zaletą drugiego sposobu jest to że używając jednej funkcji z liba - tylko jedna funkcja jest linkowana, ale gdy wpakujesz 100 funkcji do jednego pliku .obj to wszystkie te funkcje znajdą się w programie jeśli tylko odwołasz się do jednej z nich

Potem zrób jakiś plik nagłówkowy i już kompilacja potrwa tylko np 3 minuty (ale wywal te funkcje z głównego projektu).
Chyba wiesz że wtedy nie kompilujesz już tych gotowych funkcji tylko linker je dołącza do gotowego exe

0
sapero napisał(a)

Wywal te funkcje do całkiem osobnego projektu i skompiluj to jako biblioteka - będziesz miał jeden lub kilka(set) plików .obj zależnie czy wszystkie funkcje dasz do jednego pliku czy każdą do osobnego

Sposób może i dobry ale mało praktyczny - bo co się stanie jak jakaś funkcja (z OBJ'a) korzysta z obiektu, któremu w czasie projektowania zmieniliśmy interface? Podobnie ze strukturami....

Z tego co zauważyłem u siebie to BCB nie kompiluje (opcja Compile Project lub Run) plików (*.cpp) których zawartość nie została zmieniona od ostatniej kompilacji (w przypadku plików *.h jest już inaczej).

Ja raczej proponowałbym zamiast robić kilka(set) plików *.obj rozbić projekt na kilka(set) plików *.cpp

0

zdaje sie ze w przypadku naglowkow mozna skorzystac z dyrektywy #pragma hdrstop

  • jesli poumieszczasz je we wlasciwych miejscach tzn. umiescisz ja pod includami naglowkow ktore juz sie nie zmieniaja, mozna zaoszczedzic troche czasu
0

Od samego początku korzystam z #pragma hdrstop - zebrałem wszystkie pliki nagłówkowe w jeden plik o nazwie "pch.h" i dołączam go do każdego unitu w programie:

#include <vcl.h>
#include "pch.h"
#pragma hdrstop

i pomimo tego efekty takie jak w pierwszym poście :(

0

No dobra, a jak naciskasz F9(Run) to co się dzieje? Też tak długo kompiluje?

0

Średnio kompilacja jednego unitu (z prostą formatką) zajmuje około 25 sekund (przy kompilacji w tle zajmowało mi to około 40 sekund).

0

Ale za każdym razem po naciśnięciu F9 kompiluje ci cały projekt?

0

Nie za każdym razem. Robię tak, że po zmianach w danym Unicie robię sobie Alt+F9 i wtedy kompiluje mi tylko ten unit (również około 30 sekund).
Gdy próbuję uruchomić program (F9) bywa różnie - czasem przechodzi od razu do linkowania, a czasem kompiluje mi cały projekt na nowo.

0

25 s na unit to i tak okropnie duzo. Nie dolaczyles tam moze do kazdego unita jakis koszmarnych naglowkow? Albo nie uzywasz przypadkiem intensywnie STLa/Boosta? Niestety te biblioteki drastycznie spowalniaja kompilacje, bo bardzo duzo kodu jest w naglowkach i czasem ten sam kod jest kompilowany po kilka razy (mogli to lepiej zrobic...). A czy masz w opcjach kompilatora wlaczona prekompilacje naglowkow?
BCB zwykle prekompiluje naglowki, ale moze tam jest jakas opcja i ja niechcacy wylaczyles?

To sa tylko domysly. Nie uzywam BCB, ale gcc kompiluje mi na Celeronie 2.4 z szybkoscia ponad 400 linii kodu na sekunde z optymalizacja (tylko 128k cache'u - kompilatory tego nie lubia). A gcc 3 jest ponoć b. wolne.

0

W nagłówkach dołączam tylko swoje własne pliki, bez żadnych niezwykłych rozszerzeń (no chyba, że w jakiś sposób powielane jest wielokrotnie dołączanie nagłówków dla obsługi Excela, z którego korzystam w jednym z unitów).

W BCB mam włączoną opcję Cache pre-compiled headers. Do tego korzystam z osobnego pliku *.csm.

Zastanawia mnie inna jeszcze kwestia. Projekt mam zorganizowany tak, że każda część logiczna jest umieszczona w innym katalogu. Wygląda to mniej więcej tak (zarys ogólny):

|
+- mainunit.cpp
+- modul01
| +- modul01.cpp
+- modul02
| +- modul02.cpp
+- pch.h

Do wszystkich modułów (*.cpp) dołączam plik pch.h przed pragmą (jak opisałem wcześniej).
Podczas kompilacji z konsoli (make -B -f Projekt.mak) zauważyłem takie zachowanie: kompilując pliki z katalogu głównego projektu po kompilacji pierwszego pliku do pozostałych dołączane są cachowane pre-compilowane nagłówki ("loaded cached precompiled headers"). Natomiast wchodząc do poszczególnych katalogów ponownie odbywa się kompilacja pierwszego pliku i dopiero wtedy do następnych są znowu dołączane cacheowane nagłówki.

Moje pytanie: Dlaczego po wejściu do każdego katalogu plik "pch.h" jest ponownie kompilowany i cacheowany zamiast być dołączany od razu?

0

Być może któryś unit przełącza coś dyrektywą #define co ma wpływ na pliki nagłówkowe. Nie wiem czy dobrym pomysłem jest tworzenie jednego pliku *.h który zawiera inne - byc może tu tkwi przyczyna. Z resztą, sprawdź ile kompiluje się nowy-czysty projekt. Jeżeli będzie to coś ponad 0.5 minuty (u mnie 5sec) to znaczy, że coś jest nie tak albo z systemem (antyvirusy, pofragmentowany dysk etc.) albo z kompilatorem (przy okazji dowiesz się czy wina leży po stronie twojego projektu).

0

Co do dołączania jednego pliku nagłówkowego to wyczytałem na mądrych stronach www.bcbdev.com (w tej chwili nie są dostępne nie wiedzieć czemu), że pozwala to na zachowanie kolejności dołączania pliów nagłówkowych przed pragmą i teoretycznie przyśpiesza kompilację.

Mam coś ewidentnie skopane w samym projekcie, bo nowe projekty kompilują się jak burza. Tworzyłem już nowy projekt i dołączałem unity- nic to nie dało. Antywirusa usunąłem całkowicie, dysk po świeżej defragmentacji, świeży ScanDisk.... A żeby było zabawnie, to na sprzęcie słabszym ( AMD 1.7 GHz, 256MB RAM) kompilacja trwa krócej (średnio 20 sekund na unit).

Podejrzewam, że wina leży w pliku wspólnych nagłówków - podczas kompilacji nie widziane są poprawnie ścieżki do dołączanych plików i kompilator po wejściu do kolejnych katalogów kompiluje wszystko od nowa. Tylko, że z drugiej strony w opcjach projektu mam ustawione ścieżki do wszystkich katalogów, więc nie powinno być problemów.

Mówiąc krótko - zgłupiałem [???]

0

a byc moze, choc to malo prawdopodobne gdzies dochodzi do wielokrotnej kompilacji tych samych unitow? chociaz wtedy pewnie bylby wystosowany odpowiedni komunikat...

1 użytkowników online, w tym zalogowanych: 0, gości: 1