2012-07-05 16 views
6

Mam projekt, który masowo wykorzystuje szablony. Ostatnio czas kompilacji dość gwałtownie wzrósł. Zastanawiam się, czy istnieje sposób na zobaczenie, jakie klasy/linie wymagają najwięcej czasu, aby zostać skompilowane przez g ++.gcc poznaj czas kompilacji

Oto wyjściowy -ftime raporcie

Execution times (seconds) 
TOTAL     : 0.30    0.05    0.37    9119 kB 

Execution times (seconds) 
garbage collection : 0.91 (6%) usr 0.00 (0%) sys 0.92 (5%) wall  0 kB (0%) ggc 
callgraph construction: 0.23 (2%) usr 0.11 (3%) sys 0.37 (2%) wall 10652 kB (1%) ggc 
callgraph optimization: 0.18 (1%) usr 0.12 (3%) sys 0.28 (2%) wall 11906 kB (2%) ggc 
varpool construction : 0.04 (0%) usr 0.01 (0%) sys 0.08 (0%) wall 6984 kB (1%) ggc 
cfg construction  : 0.03 (0%) usr 0.00 (0%) sys 0.05 (0%) wall  644 kB (0%) ggc 
cfg cleanup   : 0.05 (0%) usr 0.02 (0%) sys 0.05 (0%) wall  7 kB (0%) ggc 
trivially dead code : 0.05 (0%) usr 0.01 (0%) sys 0.12 (1%) wall  0 kB (0%) ggc 
df scan insns   : 0.37 (3%) usr 0.03 (1%) sys 0.43 (2%) wall  677 kB (0%) ggc 
df live regs   : 0.07 (0%) usr 0.01 (0%) sys 0.02 (0%) wall  0 kB (0%) ggc 
df reg dead/unused notes: 0.08 (1%) usr 0.01 (0%) sys 0.08 (0%) wall 2755 kB (0%) ggc 
register information : 0.05 (0%) usr 0.01 (0%) sys 0.05 (0%) wall  0 kB (0%) ggc 
alias analysis  : 0.01 (0%) usr 0.01 (0%) sys 0.01 (0%) wall  878 kB (0%) ggc 
rebuild jump labels : 0.03 (0%) usr 0.01 (0%) sys 0.01 (0%) wall  0 kB (0%) ggc 
preprocessing   : 0.19 (1%) usr 0.44 (11%) sys 0.68 (4%) wall 5284 kB (1%) ggc 
parser    : 3.94 (28%) usr 1.43 (35%) sys 4.94 (27%) wall 355964 kB (48%) ggc 
name lookup   : 1.35 (9%) usr 0.88 (21%) sys 2.76 (15%) wall 64919 kB (9%) ggc 
inline heuristics  : 0.14 (1%) usr 0.03 (1%) sys 0.14 (1%) wall  0 kB (0%) ggc 
integration   : 0.02 (0%) usr 0.00 (0%) sys 0.02 (0%) wall  20 kB (0%) ggc 
tree gimplify   : 0.31 (2%) usr 0.07 (2%) sys 0.28 (2%) wall 24598 kB (3%) ggc 
tree eh    : 0.07 (0%) usr 0.02 (0%) sys 0.11 (1%) wall 7267 kB (1%) ggc 
tree CFG construction : 0.04 (0%) usr 0.04 (1%) sys 0.11 (1%) wall 15754 kB (2%) ggc 
tree CFG cleanup  : 0.12 (1%) usr 0.00 (0%) sys 0.05 (0%) wall  3 kB (0%) ggc 
tree find ref. vars : 0.03 (0%) usr 0.01 (0%) sys 0.02 (0%) wall  963 kB (0%) ggc 
tree PHI insertion : 0.00 (0%) usr 0.01 (0%) sys 0.01 (0%) wall  351 kB (0%) ggc 
tree SSA rewrite  : 0.03 (0%) usr 0.01 (0%) sys 0.01 (0%) wall 4078 kB (1%) ggc 
tree SSA other  : 0.03 (0%) usr 0.06 (1%) sys 0.12 (1%) wall 1504 kB (0%) ggc 
tree operand scan  : 0.04 (0%) usr 0.02 (0%) sys 0.08 (0%) wall 10781 kB (1%) ggc 
dominance computation : 0.15 (1%) usr 0.04 (1%) sys 0.15 (1%) wall  0 kB (0%) ggc 
out of ssa   : 0.09 (1%) usr 0.00 (0%) sys 0.02 (0%) wall  0 kB (0%) ggc 
expand vars   : 0.03 (0%) usr 0.00 (0%) sys 0.03 (0%) wall 1840 kB (0%) ggc 
expand    : 0.45 (3%) usr 0.04 (1%) sys 0.59 (3%) wall 37695 kB (5%) ggc 
post expand cleanups : 0.08 (1%) usr 0.02 (0%) sys 0.06 (0%) wall 4542 kB (1%) ggc 
varconst    : 0.15 (1%) usr 0.03 (1%) sys 0.12 (1%) wall 3595 kB (0%) ggc 
jump     : 0.01 (0%) usr 0.00 (0%) sys 0.04 (0%) wall 1904 kB (0%) ggc 
mode switching  : 0.01 (0%) usr 0.00 (0%) sys 0.01 (0%) wall  0 kB (0%) ggc 
integrated RA   : 1.33 (9%) usr 0.09 (2%) sys 1.49 (8%) wall 18163 kB (2%) ggc 
reload    : 0.60 (4%) usr 0.10 (2%) sys 0.62 (3%) wall 8668 kB (1%) ggc 
thread pro- & epilogue: 0.17 (1%) usr 0.00 (0%) sys 0.20 (1%) wall 11884 kB (2%) ggc 
reg stack    : 0.02 (0%) usr 0.00 (0%) sys 0.00 (0%) wall  0 kB (0%) ggc 
final     : 0.71 (5%) usr 0.10 (2%) sys 0.84 (5%) wall 6251 kB (1%) ggc 
symout    : 1.10 (8%) usr 0.16 (4%) sys 1.19 (6%) wall 100954 kB (14%) ggc 
uninit var analysis : 0.03 (0%) usr 0.00 (0%) sys 0.01 (0%) wall  0 kB (0%) ggc 
early local passes : 0.00 (0%) usr 0.00 (0%) sys 0.01 (0%) wall  0 kB (0%) ggc 
rest of compilation : 0.49 (3%) usr 0.06 (1%) sys 0.76 (4%) wall 19252 kB (3%) ggc 
unaccounted todo  : 0.43 (3%) usr 0.09 (2%) sys 0.55 (3%) wall  0 kB (0%) ggc 
TOTAL     : 14.26    4.11   18.52    742072 kB 
+0

Będziesz musiał podać znacznie więcej informacji. Ciężko nam pomóc, nie mając na co patrzeć. – Mysticial

+1

Możesz spróbować skompilować różne wersje i zobaczyć, kiedy nastąpi wzrost czasu; następnie sprawdź, jakie zmiany zaszły w tej wersji, aby mieć nadzieję na wgląd. – mparizeau

+0

Warto byłoby rzucić okiem na ten wątek http://stackoverflow.com/questions/2072454/how-do-i-find -out-why-g-takes-a-very-long-time -on-a-specific-file –

Odpowiedz

8

Profiler szablonów Steven'a Watanabe może pomóc w uzyskaniu liczenia instancji/klasy/funkcji. Zobacz rzeczywiste łącze do tego narzędzia, patrz Debugging GCC Compile Times.

+0

dziękuję, to naprawdę wydaje się, czego szukam! –

+1

Poza tym, że nie ma żadnych dokumentów na temat tego, jak z niego korzystać. – xaxxon

1

AFAIK, nie ma takiego przełącznika kompilacja istnieje.

Bardziej ręczną metodą może być podział między preprocessingiem i kompilacją (gcc -E, następnie gcc -c na wstępnie przetworzonym pliku), aby zgadnąć, gdzie spędzony jest czas.

Innym rozwiązaniem jest instrumentowanie środowiska kompilacji, aby mieć czas kompilacji na plik. Zauważ, że mogę tylko zalecić skonfigurowanie ciągłej integracji, aby śledzić takie ewolucje wcześniej (jak tylko się pojawi, wykryjesz to bez konieczności kopania w przeszłości, co wprowadziło skok).

Jako zasada, można sprawdzić, że tylko odpowiednie nagłówki są włączone (spróbuj usunąć niektóre) lub może przełączyć się na nagłówkach prekompilowanymi,

+0

Dziękuję bardzo. Mam już pomysł na pliki, które dają najdłuższe czasy kompilacji. I, jak sam podkreślasz, są to te, które zawierają większość nagłówków. Próbowałem z prekompilowanymi nagłówkami, ale nie otrzymałem większego ulepszenia prędkości (nadal nie rozumiem dlaczego). tylko ccache dał mi poprawę szybkości –

+0

z -Q, dostaję, że większość czasu spędza na parserze. Ale nie mam pojęcia, co to może oznaczać pod względem kodu jako podejrzanego. –

+0

Opcja "-ftime-report" istnieje w systemie Mac OS X za pomocą '/ usr/bin/gcc' -' i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (w oparciu o kompilację Apple Inc. 5658) (LLVM build 2335.15.00) '. Pełniejszy raport wydaje się pochodzić z '/ usr/bin/clang' -' Apple clang wersja 2.1 (tags/Apple/clang-163.7.1) (na podstawie LLVM 3.0svn) '. Może to być opcja "clang", lub może to być opcja w nowszych wersjach GCC. –

3

Kiedy czytam, że dokonałeś masowe wykorzystanie szablonów w projekcie moje pierwsze podejrzenie było szablon instancji, a po obejrzeniu następujące informacje, moje podejrzenie stał się silniejszy:

parser  : ... (27%) wall 355964 kB (48%) ggc 
name lookup : ... (15%) wall 64919 kB (9%) ggc 

Ponieważ nie widzę kodu (jak nie napisali go), więc mogę tylko podejrzewać,. Moja druga podejrzenie o to, że nie zostały wykorzystane wyraźny konkretyzacji szablonów dla znanych typów (który będzie z pewnością użytku), zamiast polegać na niejawny instancji i używasz szablonów z dużą ilością .cpp plik. Jeśli tak, to może to być główny problem, ponieważ instancja niejawna powoduje, że te same szablony są tworzone w postaci wielu razy w liczbie, jeden raz dla każdej jednostki tłumaczeniowej. Więc jeśli masz szablony M i używasz ich z jednostek tłumaczeniowych N (.cpp), wówczas będą pojawiały się instancje M * N, zamiast tylko instancji M.

+1

Dziękuję bardzo. Tak jest w przypadku tych samych klas szablonów tworzonych w wielu plikach .cpp. Próbowałbym znaleźć klasy szablonów, które wymagają najwięcej czasu i zmodyfikować je. –

Powiązane problemy