Profilowanie procesu kompilacji C++

Mam tendencję do pisania dość dużych szablonowych nagłówków-tylko biblioteki C++ i moi użytkownicy często narzekają na czas kompilacji. Po zastanowieniu się nad tą sprawą, przyszło mi do głowy, że nie mam pojęcia, dokąd zmierza czas . Czy istnieje jakiś prosty sposób na profilowanie procesu kompilacji C++ za pomocą popularnych kompilatorów, takich jak g++, icc i xlC? Na przykład, czy można zorientować się, ile czasu spędza się w każdej z faz kompilacji C++ ?

Author: Jack Poulson, 2012-11-26

5 answers

Dla GCC istnieją opcje debugowania aby znaleźć how much time is spent within each of the phases of C++ compilation?

-Q Sprawia, że kompilator wypisuje każdą nazwę funkcji w trakcie kompilacji i wyświetla statystyki dotyczące każdego przejścia po jego zakończeniu.

-ftime-report Sprawia, że kompilator wyświetla pewne statystyki dotyczące czasu zużywanego przez każde przejście po jego zakończeniu.

Przepustki są opisane w GCCINT 9: przepustki i pliki kompilatora .

Możesz pisać wyjście kompilacji G++ z jednego pliku źródłowego z -v -ftime-report tutaj, aby omówić to . Może być pomoc na liście dyskusyjnej GCC .


Dla kompilatorów innych niż GCC (lub GCC bardziej starożytnych niż 3.3.6) Zobacz inne opcje w tym wątku.

 53
Author: osgx,
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
2015-03-03 16:40:12

Jest Narzędzie z projektu Boost, który może być przydatny w prawie każdym kompilatorze i systemie budowania.

Narzędzie wymaga oprzyrządowania kodu źródłowego z wywołaniami makr TEMPLATE_PROFILE_ENTER() i TEMPLATE_PROFILE_EXIT(). Makra te następnie generują określoną diagnostykę (ostrzeżenia) w czasie kompilacji, które są rejestrowane i gromadzone wraz z pakietami wywołań instancji (które w konsekwencji umożliwiają budowanie i wizualizację wywołań) za pomocą skryptu. Nieźle, IMO.

I didn ' t użyj go jednak.

 13
Author: ulidtko,
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
2017-05-23 11:47:09

Jeszcze nie próbowałem, ale temlight wygląda bardzo obiecująco: https://github.com/mikael-s-persson/templight

 5
Author: Paul Brannan,
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
2015-10-21 17:03:35

Można je w pewnym stopniu oddzielić (zakładam make)

  • Dodaj regułę kompilacji, która tylko preprocesuje pliki( za pomocą przełącznika -E), i cel .PHONY, który zależy od plików wyjściowych preprocesora, tak jak normalny cel binarny zależy od Plików .o. Zmierz, ile czasu zajmuje zbudowanie tego celu
  • Dodaj obiekt docelowy 'PHONY, który zależy od wszystkich plików .o, ale nie łączy ich. Zmierzyć, jak długo trwa budowa tego celu (od clean)
  • zmierz, ile czasu zajmuje wykonanie czystej kompilacji zwykłej binarnej

Teraz masz pojęcie, ile czasu zajmuje wstępne przetwarzanie, kompilacja i łączenie. Możesz także porównać wersje optimized i non-optimized (-O0) drugiego i trzeciego celu, aby zobaczyć, jak długo jest spędzany w optymalizatorze.

 4
Author: Useless,
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-11-26 10:28:13

Możesz być w stanie uzyskać trakcję z jakimś wariantem na strace -e trace=process -f -r -ttt -T, przynajmniej dla kompilatorów takich jak g++, które są podzielone na wiele procesów.

 2
Author: Phil Miller,
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-12-01 19:26:47